3

System.Drawing inとアプリケーションを使用して、Webアプリケーションの画像を操作しています(回転、反転など)。先月、次のエラーが散発的に発生しました。

「保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。」

MSDNライブラリに基づくと、WebアプリケーションでSystem.Drawingを使用するべきではないようです(以下の挿入を参照)。

System.Drawing.Imaging名前空間内のクラスは、WindowsまたはASP.NETサービス内での使用はサポートされていません。これらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、サービスパフォーマンスの低下や実行時の例外など、予期しない問題が発生する可能性があります。

ASP.NetアプリケーションでSystem.Drawingを使用するためのフォーラム全体がASP.Netにあるため、これは正しくないように思われます。さらに、私が見つけたすべてのWeb Image EditorコントロールはSytem.Drawingを使用しているので、それがSystem.Drawingの実際の問題ではないと私が考えているもう1つの理由です。だから私が持っている質問は次のとおりです。

1)ASP.NetアプリケーションでSystem.Drawingを使用しているときに、他の誰かがこの問題を抱えていますか?もしそうなら、修正は何でしたか。

2)エラーをスローする行は以下のとおりです。問題は、MemoryStreamを使用していることであり、System.Drawingの問題ではない可能性がありますか?別のタイプのストリームを使用すると、問題が解決します。

using (System.Drawing.Image oFullImg = System.Drawing.Image.FromStream(msImage))

3)本当に問題があり、System.Drawingを使用すべきではない場合、Webサイト上の画像を操作するための他の選択肢はありますか。

これは長引くにつれてより重大な問題になりつつあるので、解決策を見つけるのが早ければ早いほどよいのです。どんな助けでもありがたいです。

4

3 に答える 3

1

いくつかの ASP.NET アプリケーションで System.Drawing 名前空間を広く使用していますが、このエラーも発生します。これはまったく一貫性がなく、他の何よりも状況 (システム リソースの使用状況、同時要求の数など) と関係があると私は信じるようになりました。画像操作が ASP.NET サイトのドメインから取り出される SOA 指向のソリューションに移行する以外に、これが起こらないことを保証するソリューションを提供することはできませんが、できるとは言えます。IDisposable を実装する System.Drawing および System.Drawing.Imaging 名前空間内のオブジェクトを確実に破棄することを絶対に積極的に行うことで、これらの発生を最小限に抑えます。. すでに using パターンでこれを行っているようですが、通常の容疑者と一緒に破棄する必要がある奇妙なオブジェクト (System.Drawing.Imaging.EncoderParameters など) があります。

これとは別に、サイトを独自の IIS アプリケーション プールに設定し、プールを定期的にリサイクルするように設定するなど、他のことを行うことができます。

ただし、この問題に対する 100% の解決策が見たいので、この質問を監視します。

于 2009-07-10T16:10:28.373 に答える
1

あなたが説明した警告は、System.Drawing.Imaging 名前空間の MSDN ドキュメントにあります。

Scott Hanselman によるこの記事を見て、光を当てることができるかどうかを確認し、codeplex の ASP.NET Generated Image プロジェクトを見てください。

最も重要なことは、ユーザーがあなたの問題について議論しているときに、ユーザーのコメントを確認することです。

肝心なのは、動作しているように見えますが、Microsoft によってサポートされていないということです。

于 2009-07-10T15:26:18.837 に答える
0

私の推測では、破損したイメージによって AccessViolationException がトリガーされていると思われます。イメージが破損していると、GDI がストリームの最後を超えて読み取ろうとするように仕向ける可能性があります。

これが発生した画像をログに記録し、画像を分析して再現可能かどうかを確認することをお勧めします。

画像に対して量子化を実行していますか、それとも LockBits を使用してデータに直接アクセスしていますか?

于 2011-10-24T12:47:56.973 に答える