处理有关MVC操作的WebDAV请求

时间:2013-04-05 17:49:02

标签: asp.net-mvc webdav

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

现在还处于早期阶段,所以我很欣赏我能以完全错误的方式做到这一点,所以欢迎任何形式的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

https://mvc4webdav.codeplex.com/