0

これが重複していないことを願っています...

サイズが約 300kb の png 形式の画像があり、次のような aspx ファイルからクライアントに送信するとします。

Bitmap img = new Bitmap(filepath);
using(MemoryStream ms = new MemoryStream())
{
    img.save(ms, ImageFormat.Png);

    Response.ContenType="image/png";
    ms.WriteTo(Response.OutputStream);
}
img.Dispose();

クライアント側の JavaScript では、単純に次のようになります。

var img = new Image();
img.src = xxx.aspx?param=semething;

これは通常はうまくいきます...しかし、時折、応答が短くなることがあります。Chrome はタイムアウトになるまでリクエストを待ちます。Firebug では、[Net] タブの [Images] ビューに、リクエストが実際に次のように表示されます。

Get xxx.aspx?param=something   hostUrl   0(14.7mb) 127.0.0.1:80

その14.7MBはかなり奇妙に見えます...一見タイムアウトした後、firebugは実際には読み込まれた画像全体を表示します..したがって、IISはこの場合すべてを送信したようです...

いずれの場合も、ヘッダーは contentType と content-Length を正しく表示しています。ブラウザーを閉じるか、Web ページから画像を取得するまで、要求が終了しない場合があります。次に、リモート ホストが接続を閉じたことを示すエラー メッセージをイベント ログに送信している IIS を見つけることができます。

私は問題を特定することができないようです...

  • 編集 -

単純に Response.TransmitFile(filePath) を実行するように変更しましたが、問題はまだ残っています。少なくともクロムでは、リクエストは最終的に90秒後にブラウザによって終了されると思います。IIS はエラーをログに記録しませんでした... IIS は、必要な処理をすべて完了したと考えているようですが、ローカル マシンでブラウザにアクセスする途中で何かが見つかりませんでした。

システムを別のマシンに持ってきて、後でテストします...また、後で.ashxに変更してみてください...

4

1 に答える 1

1

他のコードが実行されているかどうかはわかりませんが、何かを書き込む前に、最初に応答を明確にする必要があります。

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();

また、ファイルをメモリに読み込む代わりにResponse.TransmitFileを使用することを強くお勧めします。ファイルを読み込んでから出力ストリームに書き込むと、実際にメモリを消費する可能性があります。

編集

また、.aspx の代わりに .ashx を使用するように変更できれば、より高速になる可能性があります。

于 2012-10-16T08:18:12.510 に答える