【问题标题】:System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedlySystem.Net.WebException:底层连接已关闭:连接意外关闭
【发布时间】:2010-11-30 09:02:10
【问题描述】:

我正在编写一个 .NET 应用程序,它应该将数据发布到另一个 .NET 应用程序。 我使用以下代码请求登录页面

WebProxy proxy = new WebProxy("http://proxy:80/", true);
HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
//proxy.Credentials = new NetworkCredential("myusername", "mypassword", "domain"); 
// webRequest.Proxy = proxy;
webRequest.Proxy = WebRequest.DefaultWebProxy;

StreamReader responseReader = new StreamReader
                                  (webRequest.GetResponse().GetResponseStream());
string responseData = responseReader.ReadToEnd();

但在这一行失败了

StreamReader responseReader = new StreamReader
                                  (webRequest.GetResponse().GetResponseStream());

带有错误信息:

System.Net.WebException: The underlying connection was closed: The connection was 
                         closed unexpectedly.

【问题讨论】:

  • 问题似乎与服务器关闭连接有关 - 可能正在死亡。检查服务器(日志、eventwvr 等)并粘贴服务器代码。或者,您可能无法连接到正确的框(您的代理设置等)。您返回的 http 状态是什么(如果我没记错,它在异常响应中)?
  • 要开始追踪问题,我建议您将调用包装在异常捕获代码中,并打印出完整的堆栈跟踪。
  • 这个异常特别难以追踪。如果您需要任何合理的答案,请提供尽可能多的信息
  • 异常的堆栈跟踪仅给出:在 System.Net.HttpWebRequest.GetResponse()
  • 尝试从您的代码 sn-p 中删除所有未使用的废话。

标签: c# asp.net


【解决方案1】:

http GET 用于使用https 的API 时遇到相同的错误。可能对某人有帮助。

【讨论】:

    【解决方案2】:

    就我而言,这解决了问题:

    System.Net.ServicePointManager.Expect100Continue = false;
    

    以上都不是。

    【讨论】:

    • 我在尝试与嵌入式设备 Web 服务通信时遇到问题,这就是解决方案。
    • 我建议这样做:request.ServicePoint.Expect100Continue = false;
    【解决方案3】:

    我曾经遇到过这个问题。我的病毒防护是罪魁祸首。

    【讨论】:

      【解决方案4】:

      对我来说情况不同。查询时间过长,因此连接超时。 WCF中有五次超时 1. 发送超时 - 默认 1 分钟 2. 接收超时 - 默认 1 分钟 3. 打开超时 - 默认 1 分钟 4. 关闭超时 - 默认 1 分钟 5. 不活动超时 - 默认 10 分钟

      我已经正确设置了发送和接收超时,但问题是由于服务器上的查询太长而导致不活动超时,WCF 服务正在关闭通道,因此无法回传响应。 如果您使用 WCF 从需要很长时间运行的服务器获取响应,希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        似乎可能存在问题:

        1. 您永远不会将您创建的代理分配给您的 HttpWebRequest

          WebProxy **proxy** = new WebProxy("http://proxy:80/", true);
          HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
          //proxy.Credentials = new NetworkCredential("myusername", "mypassword", "domain"); 
          // webRequest.Proxy = proxy;
          webRequest.Proxy = **WebRequest.DefaultWebProxy**;
          

          你应该这样分配它:

          WebProxy proxy = new WebProxy("http://proxy:80/", true);
          HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
          webRequest.Proxy = proxy;
          

          (注意最后一行的不同)。

        2. 您在代理上使用端口 80。确定这是正确的吗?许多代理使用端口 8080。

        【讨论】:

        • 我可能想知道为什么我的问题的答案是 11 岁。无论如何,将我的代理更改为使用端口 8080 立即解决了问题。我不知道为什么。这些单元测试多年来一直在 80 端口下运行良好,但突然停止工作。感谢您的提示,11 年过去了!
        • 哈哈。总是乐于助人! - 我,11 年前 ;)
        【解决方案6】:

        在我的情况下,我需要设置代理设置,以便在同一端口上不仅允许 HTTP,还允许 HTTPS,因为其中一个请求是通过 HTTPS 协议发送的。

        【讨论】:

          【解决方案7】:
          myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials;
          

          这就是解决办法

          【讨论】:

            【解决方案8】:

            如果您使用的是 .NET 2.0 或更高版本,您是否可以启用网络跟踪并查看网络上实际发生的情况。通过这种方式,您可以获得有关此特定异常的更多信息。

            查看以下链接了解更多详情, http://msdn.microsoft.com/en-us/library/hyb3xww8%28VS.80%29.aspx

            【讨论】:

              【解决方案9】:

              不久前我遇到了同样的异常,我记得 在某些情况下是由于 .NET 中的错误而发生的。您可以通过将请求的 Timeout 和 ReadWriteTimeout 设置为更高的值来解决此问题,或者将 KeepAlive 设置为 false。

              不过,这只是一种解决方法,所以我建议您在做出任何假设之前先尝试找到真正的根本原因。

              我会尝试提供一些网络参考,同时,看看 Big files uploading (WebException: The connection was closed unexpectedly)

              【讨论】:

              • 似乎我们正在做一些事情。我现在收到错误消息远程服务器返回错误:(411)长度要求。虽然当我设置 longfeild 时应用程序挂起......