基础连接已关闭。发送时发生意外错误
The underlying connection was closed. An unexpected error occurred on a send
我正在尝试连接到 API。我会在序言中说这是我们几个月前在做的一个项目,它正在工作,至少在某种意义上我可以伸出手来从 API 中获取数据。我们将该项目搁置了几个月,然后重新开始,现在与这个 API 的连接不再有效。在项目中,我们连接到 2 API,第二个 API 连接仍然工作正常。我试图在 Postman 中使用相同的 headers 重新创建请求并且它工作正常。我以前遇到过这个问题,并添加了以下行:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
过去为我解决了这个问题,但我的方法中有该代码,但现在仍然失败。
下面是完整的方法:
var encodedData = System.Convert.ToBase64String(
System.Text.Encoding.GetEncoding("ISO-8859-1")
.GetBytes("XXXXXXXXXXXXXXXXXXX:")
);
string headerString = "Basic " + encodedData;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://xxxxxxxxxxxxxxx);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, headerString);
httpWebRequest.KeepAlive = false;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
//ServicePointManager.SecurityProtocol = (SecurityProtocolType)768;
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Console.WriteLine("Protocol: " + ServicePointManager.SecurityProtocol);
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls |
// SecurityProtocolType.Tls11 |
// SecurityProtocolType.Tls12;
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
writelog("Result: " + result);
}
不确定这是否有帮助,但是当我尝试分析 Fiddler 中的流量时,我可以看到来自 Postman 的请求正常,但是当我 运行 上面的代码时,我从来没有得到任何流量离开我的网络。只是从本地主机到 /vshub/XXXXXXXXXXX 的大量流量。正如您从注释掉的代码中看到的那样,我还尝试了 ServicePointManager.SecurityProtocol
的其他排列,但是 none 已经奏效了。
我无能为力地试图解决这个问题。
任何帮助,将不胜感激!
哦,我在 runtime 4.0
和 framework 4.6
。
更新:运行 备用机器上的代码使用相同的 运行 时间和框架,并且工作正常。似乎越来越有可能是我本地计算机上的防火墙问题。
非常感谢!
我解决了。我尝试 运行 在其他机器上使用全新安装的 Visual Studio 代码。它在所有其他机器上运行良好。我在我的本地机器上重新安装了 VS,代码工作了。不确定过去一两个月我的 VS 发生了什么变化,但显然有些东西已损坏。
这实际上是一个与TLS协议相关的问题。
在调用服务之前使用它应该可以解决问题,
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
我正在尝试连接到 API。我会在序言中说这是我们几个月前在做的一个项目,它正在工作,至少在某种意义上我可以伸出手来从 API 中获取数据。我们将该项目搁置了几个月,然后重新开始,现在与这个 API 的连接不再有效。在项目中,我们连接到 2 API,第二个 API 连接仍然工作正常。我试图在 Postman 中使用相同的 headers 重新创建请求并且它工作正常。我以前遇到过这个问题,并添加了以下行:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
过去为我解决了这个问题,但我的方法中有该代码,但现在仍然失败。
下面是完整的方法:
var encodedData = System.Convert.ToBase64String(
System.Text.Encoding.GetEncoding("ISO-8859-1")
.GetBytes("XXXXXXXXXXXXXXXXXXX:")
);
string headerString = "Basic " + encodedData;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://xxxxxxxxxxxxxxx);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, headerString);
httpWebRequest.KeepAlive = false;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
//ServicePointManager.SecurityProtocol = (SecurityProtocolType)768;
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Console.WriteLine("Protocol: " + ServicePointManager.SecurityProtocol);
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls |
// SecurityProtocolType.Tls11 |
// SecurityProtocolType.Tls12;
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
writelog("Result: " + result);
}
不确定这是否有帮助,但是当我尝试分析 Fiddler 中的流量时,我可以看到来自 Postman 的请求正常,但是当我 运行 上面的代码时,我从来没有得到任何流量离开我的网络。只是从本地主机到 /vshub/XXXXXXXXXXX 的大量流量。正如您从注释掉的代码中看到的那样,我还尝试了 ServicePointManager.SecurityProtocol
的其他排列,但是 none 已经奏效了。
我无能为力地试图解决这个问题。
任何帮助,将不胜感激!
哦,我在 runtime 4.0
和 framework 4.6
。
更新:运行 备用机器上的代码使用相同的 运行 时间和框架,并且工作正常。似乎越来越有可能是我本地计算机上的防火墙问题。
非常感谢!
我解决了。我尝试 运行 在其他机器上使用全新安装的 Visual Studio 代码。它在所有其他机器上运行良好。我在我的本地机器上重新安装了 VS,代码工作了。不确定过去一两个月我的 VS 发生了什么变化,但显然有些东西已损坏。
这实际上是一个与TLS协议相关的问题。 在调用服务之前使用它应该可以解决问题,
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;