2010年2月アーカイブ

ASP.NET(IIS5.0)において、サーバーサイドで動的(リアルタイム)に作り出した画像をクライアントへ送るには、ImageクラスからResponse.OutputStreamへSaveすればよい。

 

と、考えていた。

たとえばこんな感じ。

[C#]

Image img;

// imgに対する描画は割愛

img.Save(context.Response.OutputStream, ImageFormat.Png);

 

実際に、Visual Studioでデバッグしてみてもちゃんと動作するので、安心してIIS 5.0に持って行ってみると、「GDI+で一般的なエラーが発生しました」というエラーを吐き出す。

いろいろと試してみたところ、MemoryStreamに一度書き出してからOutputStreamへ送り込めば大丈夫。おそらく、原因はOutputStreamがシークと読み取りを禁止している点。ImageクラスのSaveメソッド内で読み返しが行われているのか、CanSeek / CanReadをチェックしているのかは不明ですが、直接書き出すのは無理っぽい。

原因が判れば、OutputStreamへの書き込みを中継するストリームを自作することで、間接的に直書きができるかもしれない、と思ってやってみた。