C# - StreamReader ReadToEnd - WebException:请求已中止:请求已被取消

时间:2017-07-08 15:50:45

标签: c# httpwebrequest streamreader

我的应用随机生成以下错误。我还没有能够在我的机器上重新生产它,但是对于安装它的用户来说,它恰好在它们身上。

System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.StreamReader.ReadBuffer()
   at System.IO.StreamReader.ReadToEnd()

奇怪的是,ReadToEnd()无法产生WebException错误(通过将鼠标悬停在它上面并查看它可能导致的异常类型),但是从这个崩溃转储中它是什么?,以确保我甚至放了一个WebException尝试抓住它仍然会发生。

我在线阅读了一点,看到它可能是由ServicePointManager.DefaultConnectionLimit引起的所以我添加了1000 in int值,现在我不确定它是否修复它 - 我还没有看到任何报告,但是没有意味着它没有发生。

using (HttpWebResponse resp = (HttpWebResponse)r.GetResponse())
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    string s = "";
    try { s = sr.ReadToEnd(); }
    catch (IOException) { return "2"; }
    catch (WebException) { return "2"; }
}

这是我正在使用的代码,如果需要,我可以提供r的值。只知道我使用了很多。

编辑:我可以在客户端确认即使ServicePointManager.DefaultConnectionLimit设置为1000,它仍然会发生。

2 个答案:

答案 0 :(得分:0)

前段时间我遇到过类似的问题。你可以像这样处理WexException:

public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
    try
    {
        return (HttpWebResponse) request.GetResponse();
    }
    catch (WebException ex)
    {
        if(ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
            throw; 

        return (HttpWebResponse)ex.Response;
    }
}

我从答案者那里借用了上面的代码:HttpWebRequest.GetResponse throws WebException on HTTP 304

然后代码的第一行会执行此操作:

using (HttpWebResponse resp = GetHttpResponse(r))

答案 1 :(得分:0)

找出了解决问题的方法,不知道为什么,但这样做有效:

try
{
    using (HttpWebResponse resp = httpparse.response(r))
    {
        if(resp != null)
        {
            using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
            {
                string s = "";
                try { s = sr.ReadToEnd(); }
                catch (IOException) { return "2"; }
            }
        } else
        {
            return "2";
        }
    }
}
catch (WebException)
{
    return "2";
}

没有意义,错误发生在sr.ReadToEnd(),但是将Try Catch放在响应()上会使它修复吗?