问题标签 [httpclientfactory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
321 浏览

inversion-of-control - 用于完整框架 (4.7) 和 IoC 的 IHttpClientFactory

我正在尝试在 Full Framework 4.7(非核心)中注册 IHttpClientFactory。我正在使用 IoC 容器(LightInject)

问题,我没有直接访问内部类 DefaultHttpClientFactory 的实现 https://github.com/dotnet/runtime/blob/master/src/libraries/Microsoft.Extensions.Http/src/DefaultHttpClientFactory.cs 这个类不是可见,因为它不公开。我找到了第 3 方实现的解决方案 - https://github.com/uhaciogullari/HttpClientFactoryLite ,它使用自己的接口。

是否可以将接口 IHttpClientFactory 与 IoC 用于完整框架(不是 .net 核心)?

如果可能的话,在 IoC 注册期间,我可以使用什么类作为 IHttpClientFactory 的实现?

0 投票
3 回答
969 浏览

c# - 池化的 HttpClient 实例是否保留 CookieContainer?

答案显示如何将 cookie 添加到 HttpClient 请求。但是其中一条评论警告说CookieContainer缓存在 HttpClient 上。我的大部分 cookie 不应再次发送给其他用户。

我希望HttpClientFactory清除CookieContainer它的池中的 HttpClient 实例之类的东西。

如果我HttpClient通过电话得到我的,我得到的httpClientFactory.CreateClient是否有可能有一个以前CookieContainer的?

更新:

我的问题的答案是肯定的! CookieContainer适用于您希望在每次通话中发送相同的 cookie 时。

如果您需要在每次调用时发送不同的 cookie,有几种方法可以做到这一点。但最简单的是将它放在标题中。

因为客户端的每个请求HttpClientFactory都会创建一个新HttpClient的,所以您可以添加到客户端的标头中,而不必担心它会重用 cookie。

这样做的关键是设置UseCookies。它必须设置为 false,否则您添加到标头的 cookie 将被忽略。完成此操作后,您可以将 cookie 添加到“Cookies”键下的标题中,并将它们作为分号分隔的键值对输入(它们之间使用等号)。您的 cookie 在标题“Set-Cookies”中返回。

0 投票
4 回答
2854 浏览

c# - 为什么 HttpClient 不保存基地址,即使它在 Startup 中设置

在我的 .net core web api 项目中,我想点击一个外部 API,以便我得到预期的响应。

我注册和使用 HttpClient 的方式如下。在启动时,我添加了以下称为命名类型化 httpclient 方式的代码。

除此之外,我还有 1 个服务可以在其中注入 HttpClient。

创建 httpClient 时,如果我将鼠标悬停在对象本身上,则缺少基本 URI/Headers,我不明白为什么会发生这种情况。如果有人可以显示一些光,我将不胜感激:)

更新第一

该服务正在以下所示的控制器之一中使用。服务由 DI 注入,然后将相对路径解析为服务(我假设我已经将基本 URL 存储在客户端中)也许我做错了?

有什么建议么?

0 投票
0 回答
99 浏览

.net - 端口耗尽 - ServicePointManager.ReusePort 和 IHttpClientFactory

在我们的服务中,我们收到System.Net.Sockets.SocketException了消息Only one usage of each socket address (protocol/network address/port) is normally permitted xx.xxx.xx.xxx:443。这表明机器上所有可用的网络端口都已用尽。

用例是对具有不同输入的同一端点进行大量 HTTP 调用,并且每次使用 IHttpClientFactory (DefaultHttpClientFactory) 创建 HttpClient。HttpClient 和 HttpResponseMessage 都包含在“使用”语句中以进行正确处理。

问题:

  1. 使用 IHttpClientFactory 创建过多的 HttpClient 对象并进行处理可以吗?
  2. 鉴于我们使用的是避免资源耗尽问题的 IHttpClientFactory,是否有助于将 ServicePointManager.ReusePort 设置为 true 以减少此 SocketException?
0 投票
1 回答
128 浏览

c# - 使用从 HttpClientFactory 注入的 HttpClient 超出范围

考虑这段代码

我有一个范围服务,可以进行 http 调用。我希望在 http 调用完成之前关闭范围。如果我手动创建和处置httpClient,那么我会自己做它超出范围。但是由于在这种情况下,客户端是依赖注入的,所以我无法控制何时处理它。是否有一种情况,在注入被处理之前,上下文将无法关闭httpClient

0 投票
1 回答
720 浏览

c# - 如何在 Blazor WebAssemly 应用程序中引用 IHttpClientFactory?

在 VS 2019 中,我正在尝试HttpClient在 Blazor WebAssemply 应用程序中进行测试。创建新项目时,我选择了该.Net Core 3.1选项。在 Program.cs 中,HttpClient服务注册如下:

在“框架”部分下,system.net.http列出了。

我们遇到了无法添加@inject IHttpClientFactory http到新的 Razor 组件的问题。错误消息是:

错误 CS0246 找不到类型或命名空间名称“IHttpClientFactory”(您是否缺少 using 指令或程序集引用?)

Microsoft 网站上的在线文档显示包中IHttpClientFactory已定义System.Net.Http。我得到错误的根本原因是什么,我该如何解决?

0 投票
1 回答
395 浏览

c# - Azure 函数/API 套接字异常

我们在高级计划上托管了 Azure 功能,并且在调用 On Premise API 时间歇性地收到System.Net.Sockets.SocketException并显示以下错误消息 -

发送请求时出错。无法从传输连接读取数据:现有连接被远程主机强行关闭。现有连接被远程主机强行关闭。

功能在 .net core 3.1 中,我们使用 httpclientfactory 来获取 httpclient... 我们没有设置超时值,所以默认应该是 100 秒。根据网络捕获,我们看到连接在 120 秒后超时。

这也发生在 .NET core 3.1 中的 Azure App Services(.net core Web API)中,并且使用与 httpclient 相同的方式。

请让我知道是否有人有可能导致的想法。我们已经验证,当从其他 On Premise API 调用 On Premise API 并且没有看到任何错误时,它们可以正常工作。我不认为这将是 httpclient 端的问题,而不是 Azure 服务 / On Premise API 之间的网络问题,但我可能错了,所以想和你们核实一下。

下面是堆栈跟踪 -

System.Net.Http.HttpRequestException:在 System.Net.Http.HttpConnection+d__53.MoveNext(System.Net.Http,版本=4.2.2.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a)在 System.Runtime.ExceptionServices.ExceptionDispatchInfo。在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess 抛出(System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e)(System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken =7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, 版本=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib ,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices。配置任务等待1+ConfiguredTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Net.Http.HttpConnectionPool+<SendWithNtConnectionAuthAsync>d__48.MoveNext (System.Net.Http, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1+ConfiguredTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Http.HttpConnectionPool+d__47.MoveNext (System.Net.Http, Version=4.2.2.0 , Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken= 7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, 版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable1+ConfiguredTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Net.Http.RedirectHandler+<SendAsync>d__4.MoveNext (System.Net.Http, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1+ConfiguredTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Http.DiagnosticsHandler+d__2.MoveNext (System.Net.Http, Version=4.2.2.0 , Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Net.Http.HttpConnection+d__53.MoveNext 处理的内部异常 System.IO.IOException:在 System.Net.Sockets.Socket+AwaitableSocketAsyncEventArgs.ThrowException (System.Net.Sockets, 版本=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Net.Sockets.Socket+AwaitableSocketAsyncEventArgs.GetResult (System.Net.Sockets, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Threading .Tasks.ValueTask1.get_Result (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1+ConfiguredValueTaskAwaiter.GetResult (System.Private.CoreLib, 版本=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Security.SslStream+<g__InternalFillBufferAsync|215_0>d 1.MoveNext (System.Net.Security, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Threading.Tasks.ValueTask1.get_Result (System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1+ConfiguredValueTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Net.Security.SslStream+<ReadAsyncInternal>d__2141.MoveNext(System.Net.Security,版本=4.1.2.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a)在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(System.Private.CoreLib,版本=4.0.0.0,Culture=neutral , PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.PrivateNonSuccessAndDebuggerNotification .CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在系统.Threading.Tasks.ValueTask1.get_Result (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1+ConfiguredValueTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Http.HttpConnection+d__87.MoveNext (System.Net.Http, Version=4.2.2.0 , Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Private.CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken= 7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, 版本=4.0.0.0,Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable+ConfiguredTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Http.HttpConnection+ d__84.MoveNext(System.Net.Http,版本=4.2.2.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a)在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(System.Private.CoreLib,版本=4.0.0.0,文化=中性, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.PrivateNonSuccessAndDebuggerNotification .CoreLib,版本=4.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Threading.Tasks.ValueTask1.get_Result (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1+ConfiguredValueTaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) 在 System.Net.Http.HttpConnection+d__53.MoveNext (System.Net.Http, Version=4.2.2.0 , Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 在 System.Net.Sockets.Socket+AwaitableSocketAsyncEventArgs.ThrowException 处理的内部异常 System.Net.Sockets.SocketException:

0 投票
0 回答
35 浏览

httpclient - 如何确认由 httpclientfactory 创建的 httpclient 不会留下开放的端口或套接字

使用由 httpclientfactory 创建的 httpclient 时,是否可以直观地看到端口或套接字正在关闭?我正在使用.NET Core 3.1。

该场景是对查询 SQL 表的 api 端点的简单调用。

我无法在 Performance Manager 中看到如何做到这一点。

基本上,我想比较使用 httpclient client = new httpclient(在 asp.net 中)与使用工厂在 .net 核心中创建的客户端时的结果。

谢谢

0 投票
1 回答
909 浏览

c# - 如何编写单元测试用例 IHttpClientFactory

我在服务层中有一个方法可以连接到服务,我正在使用IHttpClientFactory. 我的方法工作正常。现在我正在尝试为此编写单元测试用例。

对于上述方法,我正在编写测试用例。在这里,我尝试将 Post 方法设置为 OK,并期望该 MyMethodAsync方法为 true,因为它PostAsync是 true。在这里我遇到了一个例外

System.InvalidOperationException :提供了无效的请求 URI。请求 URI 必须是绝对 URI,或者必须设置 BaseAddress。

有人可以显示我在这里犯了什么错误吗?

0 投票
1 回答
797 浏览

c# - 用于 Azure 服务总线的 ServiceBusClient - 像 HttpClientFactory 一样重用 tcp 连接

我有许多通过 HTTP 调用(.NET 5)相互通信的 CRUD API
为避免打开过多的 tcp 连接,我在所有这些服务中通过 DI使用HttpClientFactory 。这很好用,我没有遇到太多通过 HTTP 打开的连接。

但我的 Azure 应用服务仍然抱怨 SNAT 连接太多:

在此处输入图像描述

我猜原因是 Azure 服务总线。我的 API 的每次调用都会将事件写入总线。
为此,我在每次调用时创建一个新实例:

许多开发人员都在使用这样的 HttpClient(这是个坏主意,请阅读上面的文章中的原因)。HttpClient 的解决方案是 .NET 为此目的提供的 AddHttpClient 方法。

但是 Azure 服务总线呢?没有什么像 AzureServiceBusFactory 这样的东西,将 AzureServiceBus 添加为 Singleton 并不是一个好主意,因为每次调用的配置都应该不同。

如何确保连接池也可用于 Azure 服务总线连接?有没有我错过的最佳实践?还是您认为连接问题有其他原因?

编辑:

公认的答案是正确的。这工作正常,我的错误消失了。只需使用以下内容添加服务总线客户端:

在此之后,您可以在所有服务中通过 DI 轻松获取客户端。