少し前に、再起呼び出しがないPGMでなぜか StackOverflowExceptionが発生した。 コードを少し眺めたが、処理の流れがループするような 箇所が見当たらない。 仕方がないので、VisualStudioでステップ実行したところ、 あるクラスのプロパティ取得の箇所でループしていた。 で、よく見ると微妙に間違ってました・・・・。 プロパティで自分自身を参照するようなロジックを入れてしまうと、その処理が無限ループし、 StackOverflowException が発生してしまう。 特にオブジェクトなどで、先頭が大文字/小文字で public・privateを判別している場合などに間違いやすいので注意したい。 やっぱprivateな変数には「_」(アンダースコア)つけた方がいいのかなぁ。 例: public string SQLConnectionString { get { if(SQLConnectionString == null) ↑自分のプロパティを参照してしまっている。(本来なら、strSQLConnectionStringを指定するはずだった) { strSQLConnectionString = getConfigValue("SQLConnectionString"); } return strSQLConnectionString; } }
普通にJpegなどの画像をASP.NETで動的に生成して、 Responseとして返す場合は、 using(Bitmap bmp = new Bitmap(intWidth,intHeight)) //略 //JPEG形式で描画 Response.ContentType = "image/JPEG"; bmp.Save(Response.OutputStream,ImageFormat.Jpeg); というコーディングで可能だが、PNG形式にしたくてこれを bmp.Save(Response.OutputStream,ImageFormat.Png); と変えただけで、"A generic error occurred in GDI+. "とか言われてエラーになる。 色々ググった結果、解決策を示したサイトを発見。 ちゃんと理由も説明されている。そのサイトによると、 MemoryStream ms = new MemoryStream(); esponse.ContentType = "image/PNG"; bmp.Save(ms,ImageFormat.Png); ms.WriteTo(Response.OutputStream); こんな感じで、いったんMemoryStreamに格納してから Responseするとうまくいくらしい。