2

我有一个现有的 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 };
}

现在还处于早期阶段,所以我很感激我可能以完全错误的方式做这件事,所以欢迎任何形式的帮助。

4

2 回答 2

2

最后,似乎更好的选择是允许用户直接与 WebDAV 服务器对话并实现身份验证逻辑来​​控制它。

IT Hit 服务器具有扩展,允许您使用来自 Office 的基本或摘要式身份验证对站点其余部分的表单身份验证进行身份验证。使用它以及对项目请求逻辑的一些其他定制为我们提供了我们需要的东西。

于 2013-04-29T12:13:04.400 回答
1

这正是我为 MVC 4 项目所做的。

https://mvc4webdav.codeplex.com/

于 2014-01-20T19:59:50.450 回答