최근에 저의 팀과 저는 Word, PPT 및 Excel 문서를보고 편집 할 수있는 WOPI 호스트를 구현했습니다. 8080
포트에서 수신 대기하고 Microsoft Office Web Apps를 통해 워드 문서를 편집하고 볼 수있는 명령 프롬프트 프로젝트 인 https://github.com/marx-yu/WopiHost을 살펴볼 수 있습니다.
우리는 webApi에서이 솔루션을 구현했으며 훌륭하게 작동합니다. 희망이 샘플 프로젝트는 당신을 도울 것입니다.
요청을받은 후, 필자는 webApi 구현을 기반으로 구현하는 방법을 명확히하기 위해 코드 샘플을 추가하려고 시도하지만 실제로 제대로 작동하도록 구현할 코드가 많습니다.
먼저 편집을 사용하려면 FilesController에서 Http Post를 캡처해야합니다. 실제 편집과 관련된 각 게시물의 헤더는 X-WOPI-Override
이며 COBALT
입니다. 이 글에서는 InputStream is과 Atom type을 발견 할 것이다. MS-WOPI 문서를 기반으로 응답에 다음과 같은 헤더 X-WOPI-CorrelationID
및 request-id
을 포함시켜야합니다.
다음은 내 webApi 게시 메소드의 코드입니다 (아직 WOPI 프로토콜을 구현하고 있기 때문에 완료되지 않았습니다).
string wopiOverride = Request.Headers.GetValues("X-WOPI-Override").First();
if (wopiOverride.Equals("COBALT"))
{
string filename = name;
EditSession editSession = CobaltSessionManager.Instance.GetSession(filename);
var filePath = HostingEnvironment.MapPath("~/App_Data/");
if (editSession == null){
var fileExt = filename.Substring(filename.LastIndexOf('.') + 1);
if (fileExt.ToLower().Equals(@"xlsx"))
editSession = new FileSession(filename, filePath + "/" + filename, @"yonggui.yu", @"yuyg", @"[email protected]", false);
else
editSession = new CobaltSession(filename, filePath + "/" + filename, @"patrick.racicot", @"Patrick Racicot", @"[email protected]", false);
CobaltSessionManager.Instance.AddSession(editSession);
}
//cobalt, for docx and pptx
var ms = new MemoryStream();
HttpContext.Current.Request.InputStream.CopyTo(ms);
AtomFromByteArray atomRequest = new AtomFromByteArray(ms.ToArray());
RequestBatch requestBatch = new RequestBatch();
Object ctx;
ProtocolVersion protocolVersion;
requestBatch.DeserializeInputFromProtocol(atomRequest, out ctx, out protocolVersion);
editSession.ExecuteRequestBatch(requestBatch);
foreach (Request request in requestBatch.Requests)
{
if (request.GetType() == typeof(PutChangesRequest) && request.PartitionId == FilePartitionId.Content)
{
//upload file to hdfs
editSession.Save();
}
}
var responseContent = requestBatch.SerializeOutputToProtocol(protocolVersion);
var host = Request.Headers.GetValues("Host");
var correlationID = Request.Headers.GetValues("X-WOPI-CorrelationID").First();
response.Headers.Add("X-WOPI-CorrelationID", correlationID);
response.Headers.Add("request-id", correlationID);
MemoryStream memoryStream = new MemoryStream();
var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
{
responseContent.CopyTo(outputStream);
outputStream.Close();
});
response.Content = streamContent;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength = responseContent.Length;
}
당신은 내가 CobaltSessionManager
과 코발트 프로토콜에 편집 세션을 생성하고 관리하는데 사용됩니다 CobaltSession
의 활용이 방법에서 볼 수 있듯이. 또한 에디션 초기화시 Office Web App 서버와 통신 할 때 여러 요청을 처리하는 데 사용되는 CobaltHostLockingStore가 필요합니다.
내가 게시 한 샘플 github 프로젝트에 이미 코딩되어 있기 때문에이 3 개의 클래스에 대한 코드를 게시하지 않으며 크다고해도 이해하기가 쉽습니다.
더 많은 질문이 있거나 명확하지 않은 경우 주저하지 말고 그에 따라 내 게시물을 업데이트 할 것입니다.
프로젝트에 대한 링크를 게시하지 않고 여기에 몇 가지 예를 추가 할 수 있습니까? – VMAtm