使用 WebApi 打開辦公文檔並使用 MS Office 保存回站點 (Open office documents with WebApi and save back to the site using MS Office)


問題描述

使用 WebApi 打開辦公文檔並使用 MS Office 保存回站點 (Open office documents with WebApi and save back to the site using MS Office)

I have done some research but this is beyond my understanding. I am using Fiddler to try to catch the request/response. The goal would be that this webapi behave like a sharepont document repository without so much resource and license. I have made some progress getting the file:

public HttpResponseMessage Get(int id)
{
    byte[] content = null;
    using (FileStream fs = File.Open(@"d:\some.docx", FileMode.Open))
    {
        content = new byte[fs.Length];
        fs.Read(content, 0, (int)fs.Length);
    }
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = new ByteArrayContent(content);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword");
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline")
    {
        FileName = "some.docx"
    };
    return response;
}

The browser offers to open the file, however the name is 5, so this part still doesn't work properly. The request is simple to get, being started by the browser, and the response looks like this (without the content):

HTTP/1.1 200 OK
Cache‑Control: no‑cache
Pragma: no‑cache
Content‑Length: 403170
Content‑Type: application/msword
Expires: ‑1
Server: Microsoft‑IIS/8.0
Content‑Disposition: inline; filename=some.docx
X‑AspNet‑Version: 4.0.30319
X‑SourceFiles: =?UTF‑8?B?QzpcV29ya1xSZXNlYXJjaFxXZWJBcGlUb09mZmljZVxXZWJBcGlUb09mZmljZVxhcGlcV29yZEFwaVw1?=
X‑Powered‑By: ASP.NET
Date: Wed, 21 Aug 2013 08:27:02 GMT  

I access the file via url: http://localhost:49590/api/WordApi/5.  

In the meantime I found the following article: http://support.microsoft.com/kb/838028 I admit I don't entirely understand it, but I think I should implement a WebDAV in my application? I tried to add some options in the hope of something changing in the request made by Office, like so:

public HttpResponseMessage Options()
{
  HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
  response.Headers.Add("MS‑AUTHOR‑VIA", new[] { "LOCK", "UNLOCK", "PROPPATCH" });
  return response;
}

But unfortunately nothing changed. The Office request was:

OPTIONS http://localhost:49590/api/WordApi/ HTTP/1.1
X‑IDCRL_ACCEPTED: t
User‑Agent: Microsoft Office Protocol Discovery
Host: localhost:49590
Content‑Length: 0
Connection: Keep‑Alive
Pragma: no‑cache

And afterwards it made another one:

HEAD http://localhost:49590/api/WordApi/5 HTTP/1.1
X‑IDCRL_ACCEPTED: t
User‑Agent: Microsoft Office Existence Discovery
Host: localhost:49590
Content‑Length: 0
Connection: Keep‑Alive
Pragma: no‑cache

Is there any way I can trick Office into sending my web API the file upon saving? Another interesting thing, when I was debugging, in the application the methods Options() and Head(int id, [FromBody] string value) are called twice but according to Fiddler the request was only sent once in both cases above.

Any idea how to implement this open/save mechanism using a webapi?

UPDATE:

Looks like everybody missed the point. The problem is not to open the document, but to save it locally using Office (not to upload a page in the application). If I use an attachment as Content‑Disposition the browser opens the file in a different way. It saves the file to the temp and opens the document from that location. In this case Office is not even try to connect to my webapi. However if I use inline Office opens the document from the website location and checks the capabilities of my webapi through the OPTIONS and HEAD requests. The browser produces the following open dialog box: If set to attachment: If set to inline:


參考解法

方法 1:

The answer is painfully. The solution is to implement WebDAV in a custom handler.

(by PéterPéter)

參考文件

  1. Open office documents with WebApi and save back to the site using MS Office (CC BY‑SA 3.0/4.0)

#ms-office #asp.net-web-api #.net #sharepoint #asp.net-mvc






相關問題

什麼是 MS Office 對比算法? (What is the MS Office contrast algorithm?)

在 Office 2007 應用程序中使用 VBA? (Use VBA in Office 2007 Applications?)

複製 Word 腳註 (Copy Word Footnotes)

使用 WebApi 打開辦公文檔並使用 MS Office 保存回站點 (Open office documents with WebApi and save back to the site using MS Office)

用於確定 Windows 和 Office 版本的快速命令或批處理腳本 (quick command or batch script to determine Windows and Office version)

通過 Office 加載項將內容添加到 Outlook 電子郵件正文 (Adding content to an Outlook email body via an Office Add-In)

Word 2016 自動化生成“錯誤:80080005 服務器執行失敗” (Word 2016 automation generates "error: 80080005 Server execution failed")

Office 2016 查找激活日期 (Office 2016 find activation date)

Word 2007 文件啟動新窗口而不是顯示內聯 (Word 2007 files launching new window instead of displaying inline)

將 A1 公式和數組轉換為 L1C1 公式,反之亦然 (convert A1 formula and Array into L1C1 formula and vice-versa)

.NET C# Office Shared Add In WCF Service 引用異常 (.NET C# Office Shared Add In WCF Service reference exception)

從顯示“錯誤!超鏈接引用無效”的 MS Word 字段中恢復 URL (Recover URL from MS Word fields showing "Error! Hyperlink reference not valid")







留言討論