【问题标题】:Returning Stream from WebRequest从 WebRequest 返回流
【发布时间】:2012-12-12 08:32:44
【问题描述】:

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

知道怎么解决吗?

【问题讨论】:

    标签: c# stream httpwebrequest


    【解决方案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;
        }
    

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

    【讨论】:

    • 没什么,这是我拥有的确切代码......所以我什么都不做
    • @Alnedru 事实上你知道。 using 关闭流。
    • 当我尝试做 resonse.GetResponseStream :(
    • MethodOne 中删除 using 部分 - using 语句中的右括号调用 Dispose() 和 WebResponse.Dispose() 方法调用 Close(),所以基本上你在做 Create WebResponse, Close WebResonse, Return closed WebResponse
    • 但是如果我将删除所有处置...这将导致什么,它们将保持开放,或者在这种情况下没关系?
    【解决方案2】:

    正如 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);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-10-19
      • 2021-03-03
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多