Jim*_*Jim 11 .net c# .net-core asp.net-core-2.1 .net-core-2.1
鉴于以下.Net Core 2.1控制台应用...
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Net.Http.Headers;
namespace TestHttpClient
{
class Program
{
static void Main(string[] args)
{
try
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string url = "https://jsonplaceholder.typicode.com/posts/1";
var response = httpClient.GetAsync(url).Result;
string jsonResult = response.Content.ReadAsStringAsync().Result;
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对GetAsync的调用挂起抛出异常,并显示以下消息:
System.Net.Http.HttpRequestException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应---> System.Net.Sockets.SocketException:A连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应
但是,切换到.Net Core 2.0,它工作正常......
注意
我尝试过使用:
HttpClientFactory -> Same result
WebRequest -> Same result
Run Code Online (Sandbox Code Playgroud)
思考?
更新1 当不在公司网络上时,这可能意味着可能意味着代理行为的改变.然而,core2.0仍然可以工作,所以试图找到差异.
更新2 看起来像一个错误被引入并报告...
https://github.com/dotnet/corefx/issues/30166#issuecomment-395489603
Dan*_*nez 12
这是CoreFx 2.1的一个变化,导致HttpClient
使用新的HttpClientHandler
.这可能是您的问题的原因以及降级的原因.
有许多方法可以重置处理程序,您可以在更改日志中阅读有关它的更多信息.您可以通过使用WinHttpHandler作为参数实例化HttpClient,将环境变量设置DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER
为false,或者通过在代码中调用以下内容来使用旧的HttpHandler :
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
Run Code Online (Sandbox Code Playgroud)
Jim*_*Jim 10
显然,有一个错误/突破性变化报告.
这里:https : //github.com/dotnet/corefx/issues/30166 https://github.com/dotnet/corefx/issues/30191
我认为是我遇到的两个独立但相关的问题.
但是,我发现似乎是一种解决方法.
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace TestHttpClient
{
static class Program
{
static async Task Main(string[] args)
{
try
{
using (var httpClient = new HttpClient(new WinHttpHandler() { WindowsProxyUsePolicy = WindowsProxyUsePolicy.UseWinInetProxy }))
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string url = "https://jsonplaceholder.typicode.com/posts/1";
var response = await httpClient.GetAsync(url);
string jsonResult = await response.Content.ReadAsStringAsync();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
throw;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里的关键部分是使用WinHttpHandler
和设置WindowsProxyUsePolicy
为WindowsProxyUsePolicy.UseWinInetProxy
WinHttpHandler
通过添加nuget包System.Net.Http.WinHttpHandler找到
归档时间: |
|
查看次数: |
9767 次 |
最近记录: |