ユーザーがファイルをアップロードして他のユーザーと共有できる既存の MVC3 アプリケーションがあります。現在のモデルでは、ユーザーがファイルを変更したい場合、そこにあるファイルを削除して、新しいバージョンを再アップロードする必要があります。これを改善するために、WebDAV を統合して、Word 文書などのオンライン編集を可能にすることを検討しています。
これまでのところ、 http: //www.webdavsystem.com/ の .Net サーバーとクライアント ライブラリを使用して、Web サイトを 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 };
}
これはまだ非常に初期の段階であるため、これを完全に間違った方法で行っている可能性があることに感謝します。