3

Web API を使用した ASP.NET MVC 4 アプリケーションがあります。それはうまくいっています。しかし、問題の 1 つは、IE では Web API からファイルをダウンロードできないことですが、Chrome や Firefox ではダウンロードできます。ブラウザは言う

"Unable to open this internet site. The requested site is either unavailable or cannot be found."

IE 8 と client-side cachingによると、no-cache 設定が問題を引き起こしているようです。そのため、そのダウンロードにプライベートキャッシュを設定したいと思います。しかし、MVC 4 では、HttpResponseMessage にプロパティ "Cache" がなく、プライベート キャッシュを設定する方法もないことがわかりました。誰でもこれを行う方法を示すことができますか?

更新 1:私のデバッグによると、それはキャッシュではなく、次のコードの「ContentDisposition」でした。

            HttpResponseMessage response = new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.OK;
            response.Content = new StreamContent(result);
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
//            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
//              {
//                FileName = "PY75.xls"
//              };
            return response;

上記のようにコメントした場合、IE は id をデフォルトのファイル名としてファイルをダウンロードできますが、上記のコメントを外すと、上記のようにはなりません。この問題を解決する方法はありますか? IE が content-disposition ヘッダーを認識できないのはなぜですか?

更新 2: IE 9 のアップグレード後、content-disposition がようやく機能し、Web API からダウンロードできるようになりました。

4

2 に答える 2

2

追加してみる

response.AddHeader("Content-Disposition", "attachment; filename=PY75.xls");

アップデート

これについて詳しく調べたところ、ストリームの開閉方法が原因である可能性があります (コードの残りの部分を見ないとわかりません。次のことを試してみたところ、うまくいきました。おそらくうまくいくでしょう!

    public HttpResponseMessage Get()
    {
        string path = @"PATH_TO_XLS";
        MemoryStream responseStream = new MemoryStream();

        using (Stream fileStream = File.Open(path, FileMode.Open))
        {
            fileStream.CopyTo(responseStream);
            fileStream.Close();
        }

        responseStream.Position = 0;

        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.OK;
        response.Content = new StreamContent(responseStream);
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "PY75.xls" };

        return response;
    }

ブラウザーに問題があることに気付いたのは、応答を返す前にメモリ ストリームが閉じられたときだけでした。これは、コンテンツをクライアントにストリーミングするためにメモリ ストリームを開く必要があるためです。ただし、IE だけでなく、すべてのブラウザーで問題が発生することに気付きました。コードの残りの部分がそれをどのように処理しているかはわかりませんが、たとえば、チャンクされた http とファイル全体を送信するだけでストリームの作成を異なる方法で処理すると、それが発生する可能性があります。

于 2012-10-08T16:24:19.610 に答える
2

私は同様の問題に直面し、ここで私の解決策についてブログを書きまし た。したがって、基本的にそのヘッダーを取り除く必要があります。また、明示的な Cache-control ヘッダーがあり、その値を no-store, no-cache にする必要がある場合、逆の順序でもダウンロードが失敗する可能性があります。

于 2014-03-13T13:38:24.347 に答える