使用来自ASP.net的http请求从Facebook关闭连接
我试图通过ASP.net核心应用程序访问Facebook rest api,但每次都会出现异常,因为远程主机关闭了连接。我尝试了四十种不同的解决方案,我在类似的问题中找到了它们,但没有一种有效。我将安全协议更改为TLS1.2,但仍然遇到相同的问题;我还尝试使用web客户端而不是http客户端。然后我想它可能是我办公室的代理,但cUrl工作得很好;使用postman我没有得到任何错误(即使tsl设置为1.0)。 另一个尝试是尝试更改保持活动的持续时间以避免超时。 以下是HttpClient的代码:使用来自ASP.net的http请求从Facebook关闭连接,asp.net,asp.net-core,Asp.net,Asp.net Core,我试图通过ASP.net核心应用程序访问Facebook rest api,但每次都会出现异常,因为远程主机关闭了连接。我尝试了四十种不同的解决方案,我在类似的问题中找到了它们,但没有一种有效。我将安全协议更改为TLS1.2,但仍然遇到相同的问题;我还尝试使用web客户端而不是http客户端。然后我想它可能是我办公室的代理,但cUrl工作得很好;使用postman我没有得到任何错误(即使tsl设置为1.0)。 另一个尝试是尝试更改保持活动的持续时间以避免超时。 以下是HttpClient的代码:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
using (var httpClient = new HttpClient()){
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
httpClient.DefaultRequestHeaders.Add("Keep-Alive", "3600");
var request = new HttpRequestMessage(HttpMethod.Get,
"https://graph.facebook.com/v10.0/me?fields=id%2Cemail%2Cfirst_name%2Clast_name&access_token=" + socialLoginModel.accessToken);
request.Headers.Add("Accept", "application/json");
request.Headers.Add("User-Agent", "BriQ");
var response = await httpClient.SendAsync(request);
}
以下是WebClient的代码:
using(var wb = new WebClient()){
var response = wb.DownloadString("https://graph.facebook.com/v10.0/me?fields=id%2Cemail%2Cfirst_name%2Clast_name&access_token=" + socialLoginModel.accessToken);
}
我完全没有主意了。可能是一些非常愚蠢的事情导致了异常,但我无法单独找出它我不确定您到底遇到了哪个异常 但据我所知,如果您使用的是.NET Core,而问题是由SSL/TLS握手失败错误引起的,那么,不幸的是,设置ServicePointManager可能无法工作 因为ServicePointManager只影响HttpWebRequest,HttpWebRequest是.NET Framework上HttpClient的默认实现。从.NETCore2.1开始,SocketShtpHandler提供了HttpClient使用的实现 因此,我认为解决此问题的方法是处理SocketsHttpHandler:
using (var handler = new SocketsHttpHandler())
{
handler.SslOptions = new SslClientAuthenticationOptions{EnabledSslProtocols = SslProtocols.Tls12};
using (var httpClient = new HttpClient(handler))
{
// your code
}
}
或者,如果您更喜欢HttpClientHandler,可以通过以下方式:
using (var handler = new HttpClientHandler())
{
httpClientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
using (var httpClient = new HttpClient(handler))
{
// your code
}
}
参考文献:
using (var handler = new SocketsHttpHandler())
{
handler.SslOptions = new SslClientAuthenticationOptions{EnabledSslProtocols = SslProtocols.Tls12};
using (var httpClient = new HttpClient(handler))
{
// your code
}
}
或者,如果您更喜欢HttpClientHandler,可以通过以下方式:
using (var handler = new HttpClientHandler())
{
httpClientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
using (var httpClient = new HttpClient(handler))
{
// your code
}
}
参考文献: