System.Net.WebException: 底层连接已经关闭:连接意外关闭。

16

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

问题似乎出在服务器关闭连接 - 可能是崩溃了。检查服务器(日志,事件查看器等),并粘贴服务器代码。或者您可能没有连接到正确的服务器(代理设置等)。您得到的HTTP状态是什么(如果我记得正确,则在异常的响应中)? - Grzenio
2
为了开始追踪问题,我建议您将调用包装在异常捕获代码中,并打印出完整的堆栈跟踪信息。 - Mitch Wheat
1
这个异常特别难以追踪。如果您想得到合理的答案,请提供尽可能多的信息。 - Rik
异常的堆栈跟踪只提供了以下信息:在 System.Net.HttpWebRequest.GetResponse() 处 - Kwah009
尝试从您的代码片段中删除所有未使用的东西。 - leppie
9个回答

9
在我的情况下,这解决了问题:
System.Net.ServicePointManager.Expect100Continue = false;

而以上都不是。

我在尝试与嵌入式设备的Web服务通信时遇到了问题,这是解决方案。 - James Allman
我建议使用以下代码:request.ServicePoint.Expect100Continue = false; - 0xTheOldOne

7

4

我曾经遇到过同样的异常,我记得这种情况在某些情况下是由于.NET中的一个错误造成的。您可以通过将请求的Timeout和ReadWriteTimeout设置为更高的值或将KeepAlive设置为false来解决此问题。

然而,这只是一种解决方法,所以我建议在做任何假设之前尝试找到实际的根本原因。

我会尝试提供一些网络参考资料,同时请查看大文件上传(WebException: The connection was closed unexpectedly)


看起来我们找到了问题所在。现在我遇到了错误信息:“远程服务器返回错误:(411)需要长度”。尽管当我设置长度字段后应用程序会挂起... - Kwah009

3

似乎存在两个可能的问题:

  1. You never assign the proxy you create to your 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**;
    

    You should assign it like this:

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

    (notice the difference in the last line).

  2. You use port 80 on your proxy. Sure that is correct? Many proxies use port 8080.


2
我应该想知道为什么解决我的问题的答案已经有11年了。无论如何,将我的代理更改为使用端口8080立即解决了问题。我不知道为什么。这些是单元测试,在端口80下运行良好多年,突然停止工作。感谢这个11年前的提示! - Mike Taverne
2
哈哈。我很乐意帮忙!- 我,11年前 ;) - Erik A. Brandstadmoen

2

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


2

当使用 http GET 请求一个使用 https 的 API 时,会遇到相同的错误。这可能对某些人有帮助。


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

0

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

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


-1
myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials;

这是解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接