2013-03-23 12 views
6

私はデータベースにドキュメントを格納しており、ドキュメントをダウンロードするためのAPIを持っています。Asp.Net MVC 4 API:IE8で失敗したdocxのダウンロード

docxファイルとのxlsxのダウンロードが

私が取得エラーメッセージは次のようであるIE9、ChromeとFFで正常に動作しますが、失敗した本当のIE8で(IE 9 IE8モードでも動作します)

idler2から393をダウンロードできません。

このインターネットサイトを開くことができません。要求されたサイトは のいずれかを使用できないか、または見つからないことがあります。後でもう一度お試しください。以下のレスポンスヘッダで

: HTTP/1.1 200 OK のCache-Control:キャッシュなし プラグマ:キャッシュなし

Content-Length: 10255 
Content-Type: application/octet-stream 
Expires: -1 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=document.docx 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Sat, 23 Mar 2013 11:30:41 GMT 

これは私のAPIメソッドである:

public HttpResponseMessage GetDocumentContent(int id) 
{ 
    Document document = Repository.StorageFor<Client>().GetDocument(id); 
    HttpResponseMessage response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
    response.Content = new ByteArrayContent(document.GetBuffer()); 
    response.Content.Headers.ContentLength = document.GetBuffer().Length; 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     //FileName = document.GetFileName(), 
     FileName = "document.docx", 
     DispositionType = "attachment" 
    }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");    
    return response; 
} 

私はコンテンツの配置とコンテンツヘッダーにかなりのバリエーションを試しましたが、運がありません。

答えて

2

一時的なフォルダにファイルを保存してダウンロードURLを返すことが、これまでに見つかった回避策のみです。 (javascript)クライアントは、新しいウィンドウを開くことができます。

本当にいいですが、MVC 4 APIにはいくつかの制限があります。

9

これはSSLで発生すると見なされます。もしそうなら、これはknown issueです。この資料では、Officeドキュメントについて説明しますが、この問題はすべてのファイルタイプに適用されます。

この記事の解決方法は、ノーキャッシュヘッダーを削除することですが、それ以上はあります。 IE8がSSL経由でWebサイトと通信する場合、IE8はno-cache要求を強制します。ヘッダーまたはヘッダーが存在する場合、IE8はファイルをキャッシュしません。したがって、ファイルを開くことはできません。これはすべてIE5からIE8に固有です。

MVC Web APIでは、実際には別のステップが必要です。新しいHttpResponseMessageを作成しているので、メッセージのヘッダーにCacheControlHeaderValueも作成する必要があります。ヘッダープロパティーを設定する必要はなく、新しいヘッダープロパティーをインスタンス化するだけです。ヘッダーは必要なものにデフォルト設定されるので、プロパティーを変更する必要はありません。

public HttpResponseMessage GetDocumentContent(int id) 
{ 
    Document document = Repository.StorageFor<Client>().GetDocument(id); 
    HttpResponseMessage response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
    response.Headers.CacheControl = new CacheControlHeaderValue(); // REQUIRED  
    response.Content = new ByteArrayContent(document.GetBuffer()); 
    response.Content.Headers.ContentLength = document.GetBuffer().Length; 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "document.docx" 
    }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    return response; 
} 

私はこの問題を解決しましたが、これで解決しました。

+1

Spot on!どうもありがとうございます。 – Frans

+1

は完璧に動作します、ありがとう! –

+0

+1:問題を抱えて答えを使って解決しましたが、IE 11、Google Chrome、Firefox 43.0.4で明らかになりましたが、リクエストしていたPDFのサイズに依存していました。約50 KBであることが判明しました...サイズに基づいて異なるキャッシングポリシー!? – dlatikay

関連する問題