我做了一些研究,但这超出了我的理解。我正在使用 Fiddler 来尝试捕获请求/响应。
目标是让这个 webapi 表现得像一个 sharepont 文档存储库,没有那么多资源和许可证。
我在获取文件方面取得了一些进展:
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;
}
浏览器提供打开文件,但名称是5
,所以这部分仍然无法正常工作。
请求很容易获得,由浏览器启动,响应看起来像这样(没有内容):
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
我通过 url: 访问文件http://localhost:49590/api/WordApi/5
。
同时我发现了以下文章: http: //support.microsoft.com/kb/838028
我承认我并不完全理解它,但我认为我应该WebDAV
在我的应用程序中实现一个?
我尝试添加一些选项,希望 Office 提出的请求有所改变,如下所示:
public HttpResponseMessage Options()
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add("MS-AUTHOR-VIA", new[] { "LOCK", "UNLOCK", "PROPPATCH" });
return response;
}
但不幸的是,一切都没有改变。办公室的要求是:
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
之后又做了一个:
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
有什么方法可以欺骗 Office 在保存时发送我的 Web API 文件?
另一个有趣的事情是,当我在调试时,在应用程序中方法Options()
和Head(int id, [FromBody] string value)
被调用了两次,但根据 Fiddler 的说法,在上述两种情况下请求只发送一次。
知道如何使用 webapi 实现这种打开/保存机制吗?
更新:
看来大家都没有抓住重点。问题不是打开文档,而是使用 Office 将其保存在本地(而不是在应用程序中上传页面)。
如果我使用附件作为 Content-Disposition,浏览器会以不同的方式打开文件。它将文件保存到临时文件并从该位置打开文档。在这种情况下,Office 甚至都不会尝试连接到我的 webapi。
但是,如果我使用内联 Office 从网站位置打开文档并通过 OPTIONS 和 HEAD 请求检查我的 webapi 的功能。
浏览器会产生以下打开的对话框:
如果设置为附件:
如果设置为内联: