C# 无法从传输连接读取数据:C中的远程主机强制关闭了现有连接#
我有一个代码,我在其中发送URL请求并接收响应,并将其作为字符串存储为C# 无法从传输连接读取数据:C中的远程主机强制关闭了现有连接#,c#,httpwebrequest,webrequest,ioexception,remote-host,C#,Httpwebrequest,Webrequest,Ioexception,Remote Host,我有一个代码,我在其中发送URL请求并接收响应,并将其作为字符串存储为 public String GenerateXML(String q)// Here 'q' is the URL { // Generating the XML file for reference // Getting the response in XML format from the URL Debug.WriteLine("The Http URL after URL encoding
public String GenerateXML(String q)// Here 'q' is the URL
{
// Generating the XML file for reference
// Getting the response in XML format from the URL
Debug.WriteLine("The Http URL after URL encoding :" + q);
try
{
Uri signs1 = new Uri(q);
//Debug.WriteLine("The Requested URL for getting the XML data :" + re);
WebRequest request1 = WebRequest.Create(signs1);
HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
//HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
Stream receiveStream = response1.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
String ab = readStream.ReadToEnd();// The mentioned error is showing up here.
// Debug.WriteLine("The data :"+a);
//XmlDocument content2 = new XmlDocument();
// content2.LoadXml(ab);
// content2.Save("C:/Users/Administrator/Downloads/direct.xml");
return ab;
}
catch (System.Net.WebException ex)
{
Debug.WriteLine("Exception caught :" + ex);
return null;
}
}
为什么远程主机关闭了连接?
消除错误或至少忽略错误并继续处理其他URL请求的可能性有哪些?我加入了try-and-catch,以避免任何错误,并在没有任何停止的情况下继续运行。在互联网上搜寻解决方案,但这个特殊问题的解决方案非常具体。请帮忙,谢谢。
提前感谢。实际异常可能是
IOException
-您需要捕获该异常类型以及WebException
。实际的问题可能是您的URL已过期,系统不再运行web服务器,或者可能需要对请求进行身份验证/需要@L.B建议的标头
此外,您可能正在泄漏各种资源。您应该使用语句将WebResponse和流包装在中
using (var response = (HttpWebResponse)request.GetResponse())
using (var receiveStream = response.GetResponseStream())
using (var reader = new StreamReader(receiveStream))
{
var content = reader.ReadToEnd();
// parse your content, etc.
}
我遇到了与不同主机强制关闭连接的类似问题。似乎可以通过更改WebRequest
对象的各种属性来解决此问题
briancaos在一篇博文中概述了以下发现:
上述帖子中提到的步骤包括:
将WebRequest.KeepAlive
设置为False
将WebRequest.ProtocolVersion
设置为HttpVersion.Version10
将WebRequest.ServicePoint.ConnectionLimit设置为1
它确实适合我,但我还没有在多台主机上测试过它。然而,我郑重地建议大家阅读这篇文章,因为它将更加详细
如果链接get被破坏,这里是Archive.org。今天也有同样的问题,因此我还将请求包装在一个try/catch with WebException中,在我的例子中,添加:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
在webRequest完成之前。此外,您还应该使用tvanfosson提到的语句将您的WebResponse和流包装在中
我希望这能有所帮助。可能服务器需要不同的url,可能请求中需要一些特殊的头,可能需要身份验证等等……@L.B如何忽略此问题并继续处理其他url?我已经试过了。还应该做些什么?试一下/接住对这里没有多大帮助。查找文档或者如果您有工作代码,请使用Fiddler查看它发送和接收的内容。嘿,我遇到了相同的问题我的代码是Dim payrep作为HttpWebResponse=DirectCast(payReq.GetResponse(),HttpWebResponse)Dim sr作为新的StreamReader(payrep.GetResponseStream())Dim response作为String=sr.ReadToEnd()sr.Close()以下是不同.NET版本支持的TLS版本: