0

对该语句的调用会引发此“WebException was unhandled”错误:底层连接已关闭:接收时发生意外错误。我认为这个错误是错过领先。这确实是使用语句包装使用语句的问题。

此代码是返回 Stream 的 WCF 服务的一部分。

如果我在 return 语句上放一个断点,它会命中两次,如果我删除外部 using 语句,它会命中一次并且代码可以工作。

我的猜测是内部 using 语句是垃圾收集外部 using 语句 MemoryStream 因为当它第一次到达断点时 ms 值是正确的,但是当它第二次到达断点时它是空的。然后调用函数抛出错误。

我通过删除第一个 MemoryStream 上的外部 using 语句来修复代码,但是当我在这里或在 Google 上查看时,我看到人们说这应该可以工作。MemoryStream 上的内部 using 语句包装在 Graphics 对象上的内部 using 语句中,这两个工作正常,但我找不到将 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 块创建它,因为该对象将在您离开方法的作用域之前被释放,因此您将返回一个空引用。

如果您将 ms 流从 using 块中取出,那么它应该可以正常工作。

于 2013-11-07T16:03:11.420 回答