2013-04-05 93 views
2

我有一個現有的MVC3應用程序,它允許用戶上傳文件並與他人共享。目前的模式是,如果用戶想要更改文件,他們必須刪除那個文件並重新上傳新版本。爲了改善這一點,我們正在考慮整合WebDAV以允許在線編輯諸如Word文檔等內容。處理MVC操作的WebDAV請求

到目前爲止,我一直在使用來自http://www.webdavsystem.com/的.Net服務器和客戶端庫將網站設置爲WebDAV服務器並與之通話。但是,我們不希望用戶直接與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 }; 
} 

它仍然是在這個非常早期所以我很感謝我能在完全可以這樣做錯誤的方式,所以任何形式的幫助是值得歡迎的。

+0

你嘗試回答OPTIONS請求爲「/文件」具有相同標題爲WebDAV服務器應該返回? – 2013-04-26 14:09:39

+0

也許問題是:「當連接到服務器時,重定向器會錯誤地假設URL名稱空間的根目錄是WebDAV感知的。不像這樣的服務器(例如通過限制WebDAV到特定的命名空間分區)不能安裝。「 - http://greenbytes.de/tech/webdav/webdav-redirector-list.html – 2013-04-26 14:10:38

回答

2

最後,似乎更好的選擇是允許用戶直接與WebDAV服務器交談並實現驗證邏輯來​​控制它。

IT Hit服務器具有擴展,允許您使用Office的基本身份驗證或摘要身份驗證,對站點其餘部分的表單身份驗證進行身份驗證。使用它和其他一些自定義項目請求邏輯給了我們我們需要的東西。