3

この質問はこれに関連しています: Cannot render image to HttpContext.Response.OutputStream。重複ではありません。

PNG を Response.OutputStream に保存しようとすると、ローカルの開発環境と運用環境の間で一貫性のない動作が発生します。つまり、私が最初に使用していたコードは、ローカルでは正常に動作しましたが、運用サーバーでは失敗しました。

ローカルで動作する元のコードは次のとおりです。

using (Bitmap bmp = challenge.RenderImage()) { 
    bmp.Save(context.Response.OutputStream, ImageFormat.Png); 
}

ローカルで作業しているにもかかわらず、それを本番サーバーにデプロイすると、アプリケーション エラーが発生しました。

GDI+ で一般的なエラーが発生しました。

掘り下げた後、問題は「 PNG画像を保存するにはシーク可能なストリームが必要である」という事実にあると判断しました。' - Response.OutputStream はそうではありません。この問題は、最初に Bitmap を System.IO.MemoryStream に書き込み、次に Response.OutputStream に書き込むことで簡単に軽減されました。

using (Bitmap bmp = challenge.RenderImage()) {
    using(MemoryStream ms = new MemoryStream()) {
        bmp.Save(ms, ImageFormat.Png);
        ms.WriteTo(context.Response.OutputStream);
    }
}

私が知りたいのは、元のコードがローカルでは問題なく動作したのに、運用サーバーでは失敗した理由です。コードの失敗の背後にある理由は、私には非常に白黒に聞こえるので、環境固有の不整合が存在する理由がまったくわかりません。

4

1 に答える 1

0

理論的には、シーク可能な独自のストリームを実装し、それを Response.Filter 属性のフィルターとして追加できるため、Cassini は内部でそのようなことを行っている可能性があります。これは、独自のストリームを接続する例です: http://www.ericis.com/2007/6/21/Obtaining%20ResponseOutputStreamLength

于 2010-10-13T02:16:40.713 に答える