0

当我从 WebRequest 返回 Stream 时遇到问题,它说流已关闭,当我在同一方法中拥有所有内容时,它的工作原理是代码示例:

public static Stream MethodOne()
{
            Uri uri = new Uri(url, true);
            WebRequest request = WebRequest.Create(uri);
            request.Method = "GET";

            Stream responseStream = null;
            using (WebResponse webResponse = request.GetResponse())
            {
                responseStream = webResponse.GetResponseStream();
            }
}

另一种方法是:

public static XDocument MethodTwo()
        {
            Stream stream = MethodOne();
            if (stream == null)
            {
                return null;
            }

            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }

我得到的错误是我尝试从流中创建 xmlReader 并显示以下消息:请求被中止:连接意外关闭。

知道如何解决吗?

4

2 回答 2

1

在读取流之前,您的 using 语句会在响应上调用 Dispose。

我会从方法一返回 WebResponse。

    public static XDocument MethodTwo()
    {

        WebResponse response = MethodOne();
        if (response == null)
        {
            response null;
        }

        try
        {
            var stream = response.GetResponseStream();
            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }
        finally
        {
            response.Dispose();
        }

    }

更新:更好的解决方案

    public static XDocument MethodTwo()
    {

        using (var response = MethodOne())
        using (var stream = response.GetResponseStream())
        {
            var stream = response.GetResponseStream();
            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }

    }

    public static Stream MethodOne()
    {
        Uri uri = new Uri(url, true);
        WebRequest request = WebRequest.Create(uri);
        request.Method = "GET";
        return request;
    }

这将确保您的资源被释放(即使发生异常)。

于 2012-12-12T08:34:25.567 回答
0

正如 SchlaWiener 指出的那样,您面临的问题是该using语句Dispose()在您可以读取流之前调用流。你应该重构你的代码如下:

public static Stream GetResponseStream() 
{
    var uri = new Uri(url, true);
    WebRequest request = WebRequest.Create(uri);
    request.Method = WebRequestMethods.Http.Get;
    WebResponse response = request.GetResponse();
    return response.GetResponseStream();
}

public static XDocument GetXDocument()
{
    using(Stream stream = GetResponseStream())
    {
        XmlReader xmlReader = XmlReader.Create(stream);
        return XDocument.Load(xmlReader);
    }
}

这样,您将确保流仅在读取后关闭。

于 2012-12-12T09:36:41.187 回答