- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有许多 .NET Core 2.1 服务和一些 .NET Framework 4.7.1 应用程序在客户的 Windows Server(我认为是 2016 年)机器上运行。客户设置了所有流量都需要使用的代理(通过控制面板 > 代理设置 > LAN 设置)。所有这些服务都在向云端发出调用。
我们看到的是来自 .NET Core 服务的一些调用正在到达云(例如我们能够查看的日志记录),但大多数其他调用正在超时。我们的 .NET Framework 应用程序没有任何这些问题。
所有服务/应用程序都使用 HttpClient(每个应用程序中的单个实例)和 HttpRequestMessage 请求,而不是 HttpWebRequest 对象。我读过,如果您使用 HttpClientHandler 初始化 HttpClient 并将 UseProxy 属性设置为 true,并将 Proxy 属性设置为 null,它应该使用 Windows 中设置的默认代理设置,我相信如果您不初始化带有 HttpClientHandler 的 HttpClient,无论如何它将使用默认的,应该具有相同的效果。
我们通过制作一个测试 .Net Core 控制台应用程序并调用大量云服务,设法追踪到 HttpClient 如何使用默认代理设置的问题。有趣的是,似乎使用了默认代理设置,因为第一次调用按预期工作。但是,此后的每个调用(对不同的云服务)都以完全相同的方式失败,就好像它根本没有使用代理设置一样。
我们已经设法通过实际提供传递给 HttpClient 的 HttpClientHandler 对象和配置为使用正确代理的 WebProxy 对象来解决这个问题。设置完成后,所有调用都会成功。这不是首选解决方案,因为它涉及客户必须为每个服务提供额外的配置。他们也不一定知道这些服务将在哪台机器上运行,并且在配置服务时可能不知道代理设置。
我们还通过另一种方式解决了这个问题,即在每次调用后处理 HttpClient 并实例化一个新的。显然这不是解决方案,因为这是不好的做法,可能会导致其他问题(并且会涉及多个依赖项中的大量代码更改)。
当我们将 .NET Core 2.1 控制台应用程序转换为 .NET Framework 4.7.1 应用程序时,我们也看不到问题。
如果我们使用 HttpWebRequest 对象发出请求,我们也看不到任何问题。
这是当前失败的控制台应用程序代码。我们在我们的服务中正确使用异步而不是调用 Result。这似乎没有什么不同。
var httpClient = new HttpClient();
Console.WriteLine("Hitting service 1 API");
var request = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}/service1/serviceinfo");
var result = httpClient.SendAsync(request).Result;
Console.WriteLine($"Response code: {result.StatusCode}");
var responseMessage = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseMessage);
Thread.Sleep(2000);
Console.WriteLine("Hitting service 2 API");
request = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}/service2/serviceinfo");
result = httpClient.SendAsync(request).Result;
Console.WriteLine($"Response code: {result.StatusCode}");
responseMessage = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseMessage);
Thread.Sleep(2000);
Console.WriteLine("Hitting service 3 API");
request = new HttpRequestMessage(HttpMethod.Get, $"{baseUrl}/service3/serviceinfo");
result = httpClient.SendAsync(request).Result;
Console.WriteLine($"Response code: {result.StatusCode}");
responseMessage = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseMessage);
预期结果:无论您是否配置了代理,所有三个调用都应该通过并收到 200 响应。
实际结果:当不使用代理时,我们得到了预期的结果,但当使用代理时,第一次调用按预期成功,但下一次调用失败,在我们的本地测试机器上出现 SocketException,或在客户机器上出现 GatewayTimeout (我相信这正是我们阻止所有未通过代理的流量的方式)。
如果每次调用都使用新的 HttpClient,则会出现预期的结果。
如果使用 HttpWebRequest 而不是使用 HttpClient,则会出现预期结果
如果使用已显式设置代理设置的 HttpClientHandler 初始化 HttpClient,则会出现预期结果。
最佳答案
经过进一步挖掘,我们找到了以下解决方案:
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
显然在 .NET Core 2.1 中,HttpClient 被迫使用新的 HttpClientHandler。您可以使用上面的 AppContext 开关,或者使用旧的处理程序初始化您的 HttpClient。这似乎是 .NET Core 的一个明显错误/回归,但我知道我似乎无法在网上找到任何其他人遇到过这个确切的问题。欢迎任何建议。也许一个错误需要报告?
关于c# - 为什么 HttpClientHandler 没有正确获取和使用默认代理设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57275600/
这是我得到的错误: Cannot initialize type 'HttpClientHandler' with a collection initializer because it does n
我需要将数据发送到需要证书授权的网络 API。但我不知道如何将证书添加到 .Net 4.5 中的处理程序。这是代码: // Import the certificate X509Certificate
我们有许多 .NET Core 2.1 服务和一些 .NET Framework 4.7.1 应用程序在客户的 Windows Server(我认为是 2016 年)机器上运行。客户设置了所有流量都需
我想使用 HttpClient 从我的 ViewModel 发送两个请求(首先是 GET,然后是 POST)。 GET 请求完成且没有任何错误。但是如果我发送 POST 请求我得到异常: {Syste
场景如下:用户使用证书身份验证连接到网络服务器,服务器正在调用其他服务,我想转发/发送我在服务器上收到的证书以通过服务对用户进行身份验证。 我在网络服务器上使用以下代码在 HttpClientHand
在 .net core 2.2(或更高版本)中,可以编写以下代码(在客户端)向启用了双向 TLS 身份验证的 REST 服务发送 json 请求并从中获取 json 响应: var clientHan
以下代码抛出“PlatformNotSupportedException”“此平台不支持操作” 它是一个 NET 标准库(尝试针对 1.4 和 2.0 进行编译),被作为 Web 应用程序运行的 .N
我有 10-150 个长寿类对象,它们调用使用 HttpClient 执行简单 HTTPS API 调用的方法。 PUT 调用示例: using (HttpClientHandler handler
当使用 HttpClient 实例和 HttpClientHandler 实例(.Net Framework,不使用 Core)时,是否可以稍后以任何方式访问 HttpClientHandler 实例
我目前正在配置我的 httpclientfactory这边走 HttpClientHandler httpClientHandler = new HttpClientHandler() { S
我有这个请求处理程序: var httpClientHandler = new HttpClientHandler { Proxy = new WebProxy(proxy.Address,
我想过用HttpClientFactory,但是调用的时候需要附上证书目前使用的是HttpClient,但是不知道怎么附上证书。 httpClient代码如下: HttpClientHandler h
我正在尝试将 Elasticsearch NEST 与 .NET Core 和我们的 Elasticsearch 实例结合使用。我们通过 SSL 连接,它有一个我们需要以编程方式接受的通配符证书。我想
我正在使用以下代码从使用 .Net Core 2.0 的 API 获取数据。 using (var handler = new HttpClientHandler() { Defaul
System.Net.Http.HttpClient和 System.Net.Http.HttpClientHandler在 .NET Framework 4.5 中实现 IDisposable(通过
在 中运行以下内容.NET 框架 4.7.2 控制台应用程序和 some_url指向我的 Windows 网络中使用 Kerberos 的服务器,我得到一个 HTTP 代码 200 背部: var h
我正在使用 Microsoft HTTP Client Libraries - PCL (通过 NuGet 安装)与公共(public) REST API 通信。因为我在公司防火墙后面,所以我需要在
我正在寻找 Mono HttpClient 堆栈的可移植替代品。可移植 Mono 版本 [常规 Mono 堆栈的一部分] 有错误。我一直在尝试修复影响我们项目的一个特定错误。由于异步操作所需的库的高度
我正在尝试使用 HTTP 客户端向网站发送表单。该网站然后根据我的请求返回一个包含数据的列表。该过程本身运行良好,但我必须执行 3 个请求,而当我在浏览器中手动执行时,一个请求就足够了。 在浏览器中,
代码如下: public static async Task DownloadPageWithCookiesAsync(string url) { HttpClientHandler hand
我是一名优秀的程序员,十分优秀!