0

このステートメントを呼び出すと、「WebException was unhandled」エラーがスローされます: 基になる接続が閉じられました: 受信時に予期しないエラーが発生しました。このエラーはミスリーディングだと思います。これは、using ステートメントをラップする using ステートメントの問題です。

このコードは、ストリームを返す WCF サービスの一部です。

return ステートメントにブレーク ポイントを配置すると、2 回ヒットし、外側の using ステートメントを削除すると、1 回ヒットし、コードが機能します。

私の推測では、内側の using ステートメントは外側の using ステートメント MemoryStream をガベージ コレクションしていると思います。最初にブレーク ポイントにヒットしたときは ms 値が正しいのですが、2 回目にヒットしたときは null だからです。次に、呼び出し元の関数がエラーをスローします。

最初の MemoryStream の外側の using ステートメントを削除してコードを修正しましたが、ここや Google を見ると、これでうまくいくはずだという人がいます。MemoryStream の内側の using ステートメントは、Graphics オブジェクトの内側の using ステートメントでラップされ、これら 2 つは正常に動作しますが、MemoryStream を内側の MemoryStream にラップする方法が見つかりません。

これをよく理解している人がこれを説明してくれることを願っています。ありがとう。

public Stream CheckForBlankPage(Bitmap bitmap)
{
    using (MemoryStream ms = new MemoryStream())
    {
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        ms.Position = 0;

        Bitmap blankImage = Resources.blank_image;

        using (MemoryStream ms2 = new MemoryStream())
        {
            blankImage.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);

            string firstBitmap = Convert.ToBase64String(ms.ToArray());
            string secondBitmap = Convert.ToBase64String(ms2.ToArray());

            if (firstBitmap.Equals(secondBitmap))
            {
                bitmap = Resources.no_image;
                Bitmap newImage = new Bitmap(160, 120);
                using (Graphics gr = Graphics.FromImage(newImage))
                {
                    gr.SmoothingMode = SmoothingMode.HighQuality;
                    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    gr.DrawImage(bitmap, new Rectangle(0, 0, 160, 120));
                }
                newImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                ms.Position = 0;
            }
        }
        WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";

        return ms;
    }
}
4

1 に答える 1

3

ここでの問題は、using ステートメントで使用されるオブジェクトを返そうとしていることだと思います。using ブロックのポイントは、人為的なスコープを作成することです。作成しているオブジェクトを返したい場合は、メソッドのスコープを離れる前にオブジェクトが破棄されるため、using ブロックで作成することはできません。 null 参照を返します。

ms ストリームを using ブロックから取り出すと、正常に動作するはずです。

于 2013-11-07T16:03:11.420 に答える