.net - 使用 WebApi 打开 office 文档并使用 MS Office 保存回站点

标签 .net asp.net-mvc sharepoint ms-office asp.net-web-api

我做了一些研究,但这超出了我的理解范围。我正在使用 Fiddler 来 try catch 请求/响应。
目标是这个 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 的功能。
浏览器打开如下对话框:
如果设置为附件:
With 'attachment'
如果设置为内联:
With 'inline'

最佳答案

答案是痛苦的。解决方案是在自定义处理程序中实现 WebDAV。

关于.net - 使用 WebApi 打开 office 文档并使用 MS Office 保存回站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18352689/

相关文章:

Sharepoint 博客文章 : Sort based on Published date

.net - 隐藏进程的所有窗口(例如 Internet Explorer)

.net - 编写基于 .NET 的 RESTful API 的最佳实践

c# - 从内存中播放 wav/mp3

asp.net-mvc - 如何将数据从 View 模型传递给 javascript 函数?

c# - 以编程方式获取特定用户的所有 SharePoint 文件夹权限

用于隐藏 Sharepoint 文档列表中按钮的 JavaScript

c# - .NET CultureInfo.InvariantCulture.CompareInfo IndexOf 与 LastIndexOf - 发生了什么?

c# - 如何有条件地阻止对 Orchard CMS 中 ContentPart 字段的验证?

c# - 如何使用 Send Grid mvc azure 通过 List<string>() 发送电子邮件