System.Net.WebException:基础连接已关闭:连接意外关闭

我正在编写一个.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. 

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

这只是一种解决方法,所以我建议你在假设之前尝试找出实际的根本原因。

我将尝试提出一些Web引用,同时查看大文件上传(WebException:连接意外关闭)

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

有关更多详细信息,请参阅以下链接, http://msdn.microsoft.com/en-us/library/hyb3xww8%28VS.80%29.aspx

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

  System.Net.ServicePointManager.Expect100Continue = false; 

以上都不是。

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

似乎可能的问题:

  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。

对我来说这是不同的情况。 查询耗时太长因此连接超时。 WCF中有五个超时1.发送超时 – 默认1分钟2.接收超时 – 默认1分钟3.打开超时 – 默认1分钟4.关闭超时 – 默认1分钟5.不活动超时 – 默认10分钟

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

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

 myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials; 

这是解决方案