我有一个非常简单的服务,它调用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,编码选项,为请求添加适当的标头的组合,这些都没有任何区别。
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上的服务是我无法控制的第三方服务。
答案 0 :(得分:6)
最后得到了最底层的答案,虽然答案可能不适用于遇到同样问题的每个人;我建议说明一点,我们可以从某个HTTPS站点获取信息,但不是全部,并通过Fiddler,WireShark和我们的防火墙的组合来跟踪事件。
在Google Chrome浏览器中打开网站,然后在网站的网址中点击“https”的挂锁,查看“安全概述”,我们看到,对于我们尝试过的大多数网站,都列出了“有效”证书'和'安全资源',但这个网站也有一个'安全TLS连接'条目,WireShark确认握手(来自Chrome)使用TLS v1.2
TLS v1.2似乎只支持.NET Framework 4.5(或更高版本),因此需要Visual Studio 2012(或更高版本)
我们目前正在使用Visual Studio 2010运行.NET Framework 4.0
下载Visual Studio 2015社区版,使用.NET Framework 4.5.2测试项目中的“相同”代码,并立即开始工作。
答案 1 :(得分:0)
//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();