5

我有一个代码,我在其中发送 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 :" + 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 和 catch 以逃避任何错误并不间断地继续运行。在互联网上搜索解决方案,但这个特定问题的解决方案非常具体。请任何帮助表示赞赏。提前致谢。

4

3 回答 3

5

我遇到了与不同主机强制关闭连接的类似问题。似乎可以通过更改WebRequest对象的各种属性来解决该问题。

briancaos 在一篇博文中概述了以下发现:远程主机强制关闭了现有连接

上述帖子中提到的步骤包括:

设置WebRequest.KeepAliveFalse

设置WebRequest.ProtocolVersionHttpVersion.Version10

设置WebRequest.ServicePoint.ConnectionLimit1

它确实对我有用,但我还没有在多个主机上测试过它。但是,我认真建议阅读这篇文章,因为它更详细。

如果链接被破坏,这里是 Archive.org缓存版本

于 2015-03-14T12:04:01.030 回答
4

实际的异常可能是IOException- 您需要捕获该异常类型以及WebException. 实际问题可能是您的 URL 已过期并且系统不再运行 Web 服务器,或者可能需要对请求进行身份验证/需要 @LB 建议的标头。

此外,您可能会泄漏各种资源。您应该将 WebResponse 和流包装在using语句中。

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.
}
于 2014-01-30T03:06:05.517 回答
4

今天遇到了同样的问题,所以我还将请求包装在带有 WebException 的 try/catch 中,就我而言,添加:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

在 webRequest 成功之前。此外,您应该将 WebResponse 和流包装在使用tvanfosson 提到的语句中。

我希望这有帮助。

于 2019-01-09T03:21:00.453 回答