6

ドキュメントをデータベースに保存していて、ドキュメントをダウンロードするためのAPIを持っています。

docxとxlsxのダウンロードは、IE9、Chrome、FFでは正常に機能しますが、実際のIE8では失敗します(IE8モードのIE 9も機能します)。

私が受け取るエラーメッセージは次のとおりです。

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

このインターネットサイトを開くことができません。リクエストされたサイトは利用できないか、見つかりません。後でもう一度やり直してください。

次の応答ヘッダーを使用:HTTP / 1.1 200 OK Cache-Control:no-cacheプラグマ:no-cache

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;
}

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

4

2 に答える 2

9

私はあなたがSSLの下でこれを経験すると仮定します。もしそうなら、これは既知の問題です。この記事ではOfficeドキュメントについて説明していますが、この問題はすべてのファイルタイプに当てはまります。

その記事の解決策は、 no-cacheヘッダーを削除することですが、それだけではありません。IE8がSSLを介してWebサイトと通信する場合、IE8はキャッシュなしの要求を強制します。1つまたは複数のヘッダーが存在する場合、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;
}

私は正確な問題を抱えていましたが、これで解決しました。

于 2013-03-28T16:42:33.150 に答える
2

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

あまり良くありませんが、MVC4APIにはいくつかの制限があるようです。

于 2013-03-26T17:27:40.670 に答える