2013-04-05 1 views
2

У меня есть существующее приложение 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 }; 
} 

Это все еще очень рано на это, так что я ценю я мог бы делать это в полностью неправильный путь, и поэтому любая форма помощи приветствуется.

+0

ли вы пытаетесь ответить на запрос OPTIONS, чтобы «/ Files» с теми же заголовками, как WebDAV сервер должен вернуться? –

+0

Возможно, проблема заключается в том, что при подключении к серверу перенаправитель делает неверное предположение о том, что корневое пространство URL-адресов будет использоваться в WebDAV. Серверы, которые не ведут себя так (например, ограничивая WebDAV определенным разделом пространства имен) не может быть смонтирован ». - http://greenbytes.de/tech/webdav/webdav-redirector-list.html –

ответ

2

В конце концов, кажется, что лучшим вариантом было позволить пользователям напрямую разговаривать с сервером WebDAV и реализовывать логику аутентификации для управления им.

Сервер IT Hit имеет расширения, позволяющие выполнять аутентификацию с помощью проверки подлинности форм для остальной части сайта с использованием базовой или дайджест-аутентификации из Office. Используя это вместе с некоторыми другими настройками логики запроса элемента, мы получили то, что нам было нужно.

Смежные вопросы