从WebRequest返回流

时间:2012-12-12 08:32:44

标签: c# stream httpwebrequest

当我从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:请求已中止:连接意外关闭。

知道怎么解决吗?

2 个答案:

答案 0 :(得分: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;
    }

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

答案 1 :(得分: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);
    }
}

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