底层连接已关闭:发生意外错误

我有一个非常简单的服务,它调用一个URL并捕获该服务写出的状态;

// Service call used to determine availability
System.Net.WebClient client = new System.Net.WebClient();

// I need this one (sorry, cannot disclose the actual URL)
Console.WriteLine(client.DownloadString(myServiceURL + ";ping"));

// I added this for test purposes
Console.WriteLine(client.DownloadString("https://www.google.com"));

myServiceURL行的“DownloadString”会引发错误“底层连接已关闭:发生意外错误”,并且该行没有任何显示在Fiddler中,而google.com的“DownloadString”正常工作,并且我看到了该控制台的输出。

按照其他错误建议,我尝试了设置UseDefaultCredentials,Encoding选项,为请求添加适当的标头的组合,这些标头都没有任何区别。

client.UseDefaultCredentials = true;
client.Encoding = Encoding.UTF8;

当我在浏览器中导航到myServiceURL时,它正常工作,并按预期显示“OK”。

来自同一服务的另一种方法编码如下:

// Request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(myServiceURL + ";login");

// Set the request configuration options
req.Method = "POST";
req.ContentType = "text/xml";
req.ContentLength = bytes.Length;
req.Timeout = -1;

// Call for the request stream
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}

// ....snip

// This line fails with the same error as before
WebResponse resp = req.GetResponse()

这一切都在使用.NET Framework 4.0的Windows 7(64位)PC上运行; myServiceURL上的服务是我无法控制的第三方服务。


终于有了底线,而答案可能并不适用于所有有同样问题的人; 我会建议的是,我们可以从一些HTTPS站点获取信息,但不是全部,并通过Fiddler,WireShark和我们的防火墙的组合来追踪事件。

在Google Chrome浏览器中打开网站,点击该网站URL地址中的“https”挂锁,查看“安全概述”,我们看到,对于大多数我们尝试过的网站,列出了“有效证书”的条目和对于'安全资源',但是这个网站也有一个'安全TLS连接'条目,WireShark确认握手(来自Chrome)使用的是TLS v1.2

TLS v1.2似乎仅支持.NET Framework 4.5(或更高版本),因此需要Visual Studio 2012(或更高版本)

我们目前使用Visual Studio 2010运行.NET Framework 4.0

使用.NET Framework 4.5.2下载了Visual Studio 2015 Community Edition以测试项目中的“相同”代码,并且它可以直接使用。


       //assuming this is set
        byte[] Data;
        string url = string.Format("{0};{1}" ,myServiceURL, "login");
        // Request
        HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(url);

        wreq.Method = "POST";
        wreq.Proxy = WebProxy.GetDefaultProxy();

        (wreq as HttpWebRequest).Accept = "text/xml";


        if (Data != null && Data.Length > 0)
        {
            wreq.ContentType = "application/x-www-form-urlencoded";
            System.IO.Stream request = wreq.GetRequestStream();
            request.Write(Data, 0, Data.Length);
            request.Close();
        }
        WebResponse wrsp = wreq.GetResponse();
链接地址: http://www.djcxy.com/p/22159.html

上一篇: The underlying connection was closed: An unexpected error occurred

下一篇: Why can't I extract a zip file from a POST request?