使用包含在using语句中的语句抛出错误C#.NET WCF服务

时间:2013-11-07 15:30:01

标签: c# .net wcf using

对此语句的调用会抛出此“WebException未处理”错误:基础连接已关闭:接收时发生意外错误。我认为这个错误是错过领先的。使用语句包装语句确实存在问题。

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

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

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

我通过删除第一个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;
    }
}

1 个答案:

答案 0 :(得分:3)

我认为你的问题是你正在尝试返回using语句中使用的对象。使用块的目的是创建一个人工范围,如果要返回正在创建的对象,则无法使用using块创建它,因为在离开方法范围之前对象将被处置,因此您将返回一个空引用。

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