我有一个现有的 MVC3 应用程序,它允许用户上传文件并与他人共享。当前的模式是,如果用户想要更改文件,他们必须删除那里的文件并重新上传新版本。为了改进这一点,我们正在研究集成 WebDAV 以允许在线编辑 Word 文档等内容。
到目前为止,我一直在使用来自http://www.webdavsystem.com/的 .Net 服务器和客户端库将网站设置为 WebDAV 服务器并与之通信。
但是,我们不希望用户直接与 WebDAV 服务器交互(我们有一些复杂的规则,用户可以根据域逻辑在某些情况下执行什么操作),而是通过之前的控制器操作来访问文件。
到目前为止,它正在运行到我们可以返回文件的地步,它提供了 WebDAV-y 类型的提示来打开文件。
问题是它总是停留在只读模式。如果我使用直接 WebDAV URL 但不是通过我的控制器操作,我已经确认它可以工作并且是可编辑的。
使用 Fiddler 我想我发现问题是 Word 正在尝试与服务器协商有关锁定的位置,该位置没有返回正确的详细信息。用于下载文件的控制器操作是“/Files/Download?filePath=bla”,因此 Word 在发送 OPTIONS 请求时会尝试与“/Files”通信。
我是否只需要在该位置执行一个知道如何响应 OPTIONS 请求的操作,如果是,我将如何响应?或者,是否有另一种方法可以做到这一点,也许通过在响应中添加一些属性来通知 Word 它应该在哪里查找?
这是我的控制器操作:
public virtual FileResult Download(string filePath)
{
FileDetails file = _fileService.GetFile(filePath);
return File(file.Stream, file.ContentType);
}
这是文件服务方法:
public FileDetails GetFile(string location)
{
var fileName = Path.GetFileName(location);
var contentType = ContentType.Get(Path.GetExtension(location));
string license ="license";
var session = new WebDavSession(license) {Credentials = CredentialCache.DefaultCredentials};
IResource resource = session.OpenResource(string.Format("{0}{1}", ConfigurationManager.AppSettings["WebDAVRoot"], location));
resource.TimeOut = 600000;
var input = resource.GetReadStream();
return new FileDetails { Filename = fileName, ContentType = contentType, Stream = input };
}
现在还处于早期阶段,所以我很感激我可能以完全错误的方式做这件事,所以欢迎任何形式的帮助。