我有一个现有的 MVC3 应用程序,它允许用户上传文件并与其他人共享。当前的模式是,如果用户想要更改文件,他们必须删除那里的文件并重新上传新版本。为了改进这一点,我们正在考虑集成 WebDAV 以允许在线编辑 Word 文档等内容。
到目前为止,我一直在使用 http://www.webdavsystem.com/ 中的 .Net 服务器和客户端库。将网站设置为 WebDAV 服务器并与其通信。
但是,我们不希望用户直接与 WebDAV 服务器交互(我们有一些复杂的规则,用户可以根据域逻辑在某些情况下执行操作),而是执行之前用于访问文件的 Controller 操作.
到目前为止,它正在工作,我们可以返回文件,并给出打开文件的 WebDAV-y 类型提示。
问题是它总是停留在只读模式。我已经确认,如果我使用直接 WebDAV URL 但不通过我的 Controller 操作,它可以工作并且可以编辑。
使用 Fiddler 我想我发现问题是 Word 正在尝试与服务器协商有关锁定位置的信息,但该位置未返回正确的详细信息。下载文件的 Controller 操作是“/Files/Download?filePath=bla”,因此 Word 在发送 OPTIONS 请求时尝试与“/Files”通信。
我是否只需要在该位置执行一个操作来知道如何响应 OPTIONS 请求?如果是,我将如何响应?或者,是否有另一种方法可以做到这一点,也许可以通过在响应中添加一些属性来通知 Word 它应该在哪里查找?
这是我的 Controller 操作:
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 };
}
现在还处于早期阶段,所以我很高兴我可能会以完全错误的方式做这件事,因此欢迎任何形式的帮助。
最佳答案
最后,似乎更好的选择是允许用户直接与 WebDAV 服务器对话并实现身份验证逻辑来控制它。
IT Hit 服务器具有扩展功能,允许您使用 Office 的基本或摘要身份验证对站点其余部分的表单例份验证进行身份验证。使用它以及对项目请求逻辑的一些其他自定义可以满足我们的需要。
关于asp.net-mvc - 处理 MVC 操作上的 WebDAV 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840273/