У меня есть существующее приложение MVC3, которое позволяет пользователям загружать файлы и делиться ими с другими. Текущая модель заключается в том, что если пользователь хочет изменить файл, он должен удалить его и повторно загрузить новую версию. Чтобы улучшить это, мы изучаем интеграцию WebDAV, чтобы разрешить онлайн-редактирование таких документов, как документы Word.Обработка запросов WebDAV при действии MVC
До сих пор я использовал серверные и клиентские библиотеки .Net от http://www.webdavsystem.com/, чтобы установить веб-сайт в качестве сервера WebDAV и поговорить с ним.
Однако мы не хотим, чтобы пользователи напрямую взаимодействовали с сервером WebDAV (у нас есть некоторые сложные правила, по которым пользователи могут делать то, что в определенных ситуациях на основе логики домена), но проходят предыдущие действия контроллера, которые мы имели для доступа файлы.
Пока он работает до такой степени, что мы можем вернуть файл, и он дает приглашение типа WebDAV-y для открытия файла.
Проблема в том, что он всегда застрял в режиме только для чтения. Я подтвердил, что он работает и доступен для редактирования, если я использую прямой URL WebDAV, но не через действие моего контроллера.
Использование Fiddler Я думаю, что я обнаружил, что проблема заключается в том, что Word пытается поговорить с сервером о блокировке с местоположением, которое не возвращает правильные детали. Действие контроллера для загрузки файла «/ Files/Download? FilePath = bla», и поэтому Word пытается поговорить с «/ Files», когда он отправляет запрос OPTIONS.
Нужно ли просто иметь какое-либо действие в этом месте, которое будет знать, как реагировать на запрос 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 };
}
Это все еще очень рано на это, так что я ценю я мог бы делать это в полностью неправильный путь, и поэтому любая форма помощи приветствуется.
ли вы пытаетесь ответить на запрос OPTIONS, чтобы «/ Files» с теми же заголовками, как WebDAV сервер должен вернуться? –
Возможно, проблема заключается в том, что при подключении к серверу перенаправитель делает неверное предположение о том, что корневое пространство URL-адресов будет использоваться в WebDAV. Серверы, которые не ведут себя так (например, ограничивая WebDAV определенным разделом пространства имен) не может быть смонтирован ». - http://greenbytes.de/tech/webdav/webdav-redirector-list.html –