问题标签 [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 投票
3 回答
7930 浏览

c# - 为集成测试创建默认的 HttpClientFactory

我有一个键入的客户端,我想将其注册为单例:

类型化的客户端必须是单例的,因为它有一些断路器逻辑,如果 API 限制客户端的速率,它会断开电路。必须在整个应用程序中断开电路,而不仅仅是当前的请求管道(否则客户端将继续访问已经受到其他实例速率限制的 API)。这已经通过使用封装了该功能的类型化客户端来实现(虽然不是 Polly)。

现在因为类型化的客户端将是一个单例,所以我们不能注入一个单例,HttpClient因为这会带来我们之前在一个 long living 中遇到的所有问题HttpClient。显而易见的解决方案是注入一个HttpClientFactorynow 可用于在HttpClient每次键入客户端需要一个实例时发出一个实例,而不必担心生命周期管理等,因为这已推迟到HttpClientFactory现在。

我现在的问题是如何HttpClientFactory为一个简单的功能集成测试创建一个默认值,我想在其中实例化一个类型化的客户端,看看我是否可以点击 API 并从自动化测试中获得成功的响应?

我不想围绕它设置一个 ASP.NET Core TestServer 和一个完整的应用程序,因为这对于我现在想做的那种功能测试来说太过分了。

没有可用于注入的公共构造函数HttpClientFactory

0 投票
4 回答
18629 浏览

c# - 我可以在不是 ASP.NET Core 的 .NET.core 应用程序中使用 HttpClientFactory 吗?

我已阅读有关使用 HttpClientFactory的热门博文https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore

引用它

ASP.NET Core 2.1中提供了一个新的 HttpClientFactory 功能,它有助于解决开发人员在使用 HttpClient 实例从其应用程序发出外部 Web 请求时可能遇到的一些常见问题。

所有示例都显示在 asp.net 应用程序的启动类中将其连接起来,例如

我的问题是你可以在 ASP.NET 核心之外使用吗?如果是的话,有没有例子

我会认为很多非网络应用程序(.net 核心应用程序)需要进行网络调用,那么为什么这不是 .net 核心 api 的一部分而不是放入 asp.net 核心 api

0 投票
1 回答
613 浏览

memory - HttpClientFactory 内存泄漏

在我的 c# 控制台应用程序(.net 4.6.1)中,我需要对随机端点进行 API 调用(Get/Post/Put/delete)等。url、payload 等的详细信息来自数据库表。控制台应用程序获取 httpClientFactory 实例,如下所示

对于从表中获得的每条记录,我调用一个方法来进行 API 调用。对于那个方法,我传递了 httpClientFactory。在该方法中,我正在创建和使用 HttpClient,如下所示。

我不在处理 httpClient 的地方。当我看到内存使用情况时,它一直在增加,即使在几个小时后我也没有看到它下降。

我关注了以下文章 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1

我用对了吗?我应该使用“使用(httpClient)”吗

0 投票
0 回答
991 浏览

asp.net-core-2.1 - 具有动态配置的 HttpClientFactory

我正在开发 .net 核心网络应用程序,它需要以特定的时间间隔调用远程 API(每 2 分钟,20 次不同的 API 调用,我需要向最终用户显示 API 结果),托管有4 个不同的域名

我使用 HttpClient 来调用远程 API。但是随着用户的增加,我的 CPU 使用率增加了 40%。我怀疑 HttpClient 可能是原因。在浏览了几篇博客之后,我正在尝试使用 HttpClientFactory。
我有一个从 Controller Action 调用的方法,我需要根据几个参数动态识别 BaseUrl 。目前我在 StartUp.cs 中创建了 4 个 NamedClients,如下所示:

然后像这样在课堂上使用:

在这里,根据 displayname 参数,我可以决定使用哪个 NamedClient。
有没有其他有效的方法来实现所需的功能?我可以改用 TypedClient 吗?

0 投票
1 回答
792 浏览

c# - 添加 HttpClientFactory 导致 cancelTokenSource 错误

我的 HttpClientFactory 有问题,我正在尝试将 CancellationTokenSource 从 DI 注入到我的“SomeClient”,该“SomeClient”配置为:

我在 AddScoped<>() 的 Startup.cs 中注入了 cancelTokenSource。

如果我将 CancellationTokenSource 添加到 SomeClient 构造函数,它会说

无法从根提供程序解析范围服务“System.Threading.CancellationTokenSource”。

但如果我创建类似的东西:

并在构造函数中新建一个本地HttpClient,并注入CancellationTokenSource,一切都会好起来的。

所以我的问题是如何将 CancellationTokenSource 与 HttpClientFactory 一起使用?

0 投票
0 回答
139 浏览

c# - 在某些调用中不使用 httpClient.BaseAddress 会导致创建新客户端吗?

我正在使用.net core 2.1 HttpFactory并且我BaseAddress在调用时在启动中设置了services.AddHttpClient.

几乎我所有的调用都使用BaseAddress,但有些需要调用其他 URL,所以对于那些,我直接传递完整的 URL。

这会处理我的httpClient并创建一个新的吗?我是否应该拥有 2 种不同的客户端类型并在启动时分别注册它们BaseAddress(我什至可以使用HttpFactory?)?

我在问这个问题,因为我的集成测试在使用“超时样式”取消令牌的调用方面存在问题。

PS:不使用BaseAddress会很痛苦,因为 URL 取决于环境。


更新:我测试了注册命名客户端。一种用于主要情况,另一种用于不同的情况BaseAddress。它似乎对我的集成测试有所帮助,因为现在它们很少超时(当它们超时时,我认为它可能与另一个问题有关)。

这增加了我原来的问题,因为它似乎会影响性能。再说一次,是否有可能对使用Clientthe 或完整地址的呼叫使用相同的地址会提示对from the 的BaseAddress处置/娱乐?ClientHttpFactory

0 投票
1 回答
504 浏览

asp.net-core - Asp.net Core 2.1 HttpClientFactory:第二个api调用不等待第一个api调用的返回结果

我在使用 HttpClientFactory 时遇到了问题。我需要从一个第三方 Web api 调用两个 Web 方法。

  1. 获取订单号。
  2. 获取运输标签文件。

调用 #2 取决于 #1 的结果,因为它需要将 orderNumber 传递给它,例如:

当我设置断点和调试时,它按预期工作。没有调试模式,#2 web 方法总是失败。我做过调查。如果我传递静态查询参数,例如:

它工作正常。似乎 #2 在 orderNumber 给它之前评估查询字符串并执行 api 调用。非常令人沮丧,请您对这个问题有所了解吗?

在控制器上:

HttpClient 类型类:

0 投票
1 回答
1516 浏览

asp.net - 使用 HttpClientFactory 是否安全?

在我的 asp.net 核心 MVC 应用程序中,我正在使用为 API 服务器的请求HttpClientFactory创建对象。HttpClient

遵循 Microsoft 文档,HttpClient每次调用时都会创建新对象HttpClientFactory.CreateClient(),因此将值设置为HttpClient.DefaultRequestHeaders.

关于HttpMessageHandler对象,因为它们是池化的,以后可以重复使用。因此,如果他们持有 cookie 信息(例如:将 cookie 设置为HttpClientHandler对象),我们将违反线程安全。

我的假设是否正确?我们该如何处理这个问题?

如果我们设置 cookie 是否可以HttpRequestMessage,然后我们将发送它HttpClient

0 投票
0 回答
89 浏览

asp.net-mvc - 是 HttpClientFactory 错误吗?

我有一个带有以下代码的 Web 应用程序和一个 API 应用程序:

网站:

接口:

Test如果我第一次(在 Firefox 上)调用我的操作,响应将是First time。但是如果我第二次调用(在 Chrome 中),响应将大于 1

这是不正确的,因为在其他浏览器中,它必须被视为第一次。

经过调查(使用调试),在对 API 的第二次请求中,我发现 pooledHttpClientHandler被重新使用(正如我们在使用时所期望的那样HttpClientFactory)并且CookieContainerofHttpClientHandler也被重新使用,HasAccessed cookie 的值为true => This导致问题。(我预计这个 cookie 不存在,因为它被认为是 Chrome 对 API 的第一个请求)

这个问题有什么解决办法吗?

0 投票
2 回答
1456 浏览

c# - 在控制器和 ActionFilter 之外获取 ModelState

有没有办法ModelStateDictionary从 DI 访问(在控制器或 ActionFilter 之外)?我想我可以制作一个 ActionFilter 来存储对ModelStateDictionary某处的引用,以便稍后在其他地方访问它,但我想知道是否有一种传统的方式来访问它,例如IHttpContextAccessorfor HttpContext

我们有一个 Web 应用程序,它是我们 api 的客户端。我想这样做的原因是因为我想ModelStateDelegatingHandler我们的 API 客户端(一个类型化的 http 客户端)使用的网络应用程序中自动添加错误。处理程序将监视来自 API 的每个响应,并且对于适用的响应(正文中带有自定义错误代码的 400 个响应,例如“名称已采用”),将消息添加到ModelState.

到目前为止,我已经尝试过要求 a ControllerContext,但它似乎总是为空。

我还使用 VS 调试器查看了所有注册的服务,但我找不到任何有希望的东西。


关于关于 SRP 和关注点分离的评论的旁注(相当大的一个):我不认为这违反了 SRP。API 客户端是我们 API 的通用客户端实现,可以在任何地方使用(我们目前在 Xamarin 和 ASP.NET Core MVC Web 应用程序上使用它 - 在这个问题中提到的那个)。但是,API 客户端HttpClient在其构造函数中需要 a,这意味着它的行为可以被它的消费者修改。

例如,Web App 使用 DI 来提供HttpClientAPI 客户端的需求。这HttpClient是设置为使用两个委托处理程序,其中一个是我在这个问题中描述的那个。

至于是否ModelState应该在控制器之外进行操作:嗯,这正是库之类的FluentValidation(和 ASP.NET 默认验证)所做的。

至于是否ModelState应该在 a 中操作DelegatingHandler:我认为这是一个更有效的讨论。然而,没有人真正提出过为什么这是不好的论据。

至于这是否应该“自动”完成:我认为将代码放在一个地方比必须记住在每次调用 api 的每个动作中每次都这样做更好。

至于是否应该将这些消息放入ModelState: 好吧,如果我在这里进入,这个旁注会变得太大。而且,没有人真正争论过这一点,所以......