问题标签 [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 回答
5567 浏览

.net-core - AddHttpClient 配置的 HttpClient.Timeout 被忽略

当使用推荐的AddHttpClient扩展来配置IHttpClientFactory并包含一些默认HttpClient设置时,我为该属性设置的值在我随后创建Timeout的实例中看不到。HttpClient

Demo 使用 Azure Function,类似于 ASP.NET Core。

创建客户端。

退货

0 投票
1 回答
658 浏览

httpclient - IHttpClientFactory、SetBearerToken()、AddHttpClient<> 和“您使用错误的 HttpClient”

我相信我们都读过这篇在 2016 年引起轰动的文章:https ://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

对于那些没有的人,总结一下(强调我的):

您应该在应用程序的整个生命周期内共享一个 HttpClientHttpClient实例,而不是为每次执行创建一个新实例。

现在,考虑一个 ASP.NET Core 应用程序,它使用HttpClient. 它的使用HttpClient一般分为两种情况:

  1. 未经身份验证或使用网站自己的凭据的传出请求 - 在这种情况下HttpClient,程序的所有部分都可以共享一个请求。

  2. 代表网站当前访问者之一发出的传出请求 - 或使用特定于请求的凭据的请求。

    • 虽然可以使用单个HttpClient实例,但您必须注意不要改变其状态,例如通过设置(例如通过使用扩展方法)。DefaultRequestHeadersSetBearerToken

几乎所有HttpClient在 ASP.NET Core 中使用的指南都说:

  • 使用类型化客户端(接受HttpClient实例作为构造函数参数的 POCO,以及任何其他 DI 服务)。
  • 使用 注册这些类型化客户端services.AddHttpClient<TClient>()
    • 这将注册TClient瞬态实例。
    • 这将注册ITypedHttpClientFactory<TClient>瞬态实例。
    • 这将注册IHttpClientFactory单例
    • 这将注册IHttpMessageHandlerFactory单例

有了现在讨论的内容,我将把你的注意力引向一个矛盾:

  • 著名的博客文章——现在是微软自己的文档——说这些HttpClient实例必须是长寿命的。
  • ASP.NET Core 的HttpClientDI 系统确实确保HttpClient实例的生命周期很短。

但是,如果博客文章真的应该谈论底层HttpMessageHandler(这是真正的HttpClient 实现,它只是由薄壳包裹class HttpClient)而不是外部,这可能class HttpClient吗?

令人困惑的是,人们也报告了使用长寿命HttpClient实例的问题,并介绍了其他所有涉及的解决方法,static class ServicePointManager这让我感到不舒服:

我的问题:

  • HttpClient实例真的意味着寿命长还是寿命短?
  • 还是只是HttpMessageHandler需要长期存在的实例?
  • 如果HttpClientHttpMessageHandler实例意味着长寿:
    • 如何正确解决ServicePointManager两个链接博客文章中提出的问题?
    • 我是否绝对必须避免使用HttpClient.DefaultRequestHeaders,而是明确设置每个Authorization(Cookies or Credentials) 标头HttpRequestMessage?有没有其他更省事的方法?
    • 我可以使用我自己的添加这些标题DelegatingHandler吗?那么这个提议的处理程序的 DI 注册应该是什么?
  • 如果HttpClient实例(但不是HttpMessageHandler实例)意味着寿命短:

    • ...那么可以使用HttpClient.DefaultRequestHeaders(and SetBearerToken()) 吗?
    • HttpMessageHandler那么实例的生命周期策略是什么?
    • 我还能使用HttpClient.DefaultRequestHeaders(and SetBearerToken()) 吗?
  • 如果HttpClient实例 HttpMessageHandler实例的生命周期很短:

    • 那么 2016 年原始博客文章中提到的问题呢?
      • 是否IHttpClientFactory采取任何措施来缓解这些问题?
0 投票
1 回答
377 浏览

c# - 带有类型化客户端的 cookieContainer

需要向需要特定 cookie 的服务器发出请求。能够使用带有 cookiecontainer 的 HTTP 客户端和处理程序来执行此操作。通过使用 Typed 客户端,无法找到设置 cookiecontainer 的方法。

使用 httpclient:

使用 HttpClientFactory:

在启动.cs

在控制器类

在 Addcookie 方法中,我需要将 cookie 添加到容器中。任何建议如何做到这一点。

0 投票
1 回答
380 浏览

c# - 使用 HttpClientFactory “无法对套接字执行操作”

我在 Azure 上有一个长时间运行的触发网络作业,它使用多个类型化的 http 客户端来访问远程服务。每次启动的请求量高达数百万,但在大约 30k 之后,我得到以下异常:

System.Net.Http.HttpRequestException:无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满。

我正在使用 Microsoft.Extensions.Http 2.2.0 通过 Http Client Factory 注入类型化的 http 客户端。

到目前为止,我已经尝试使用假数据和接收器在本地运行它;并监视与

网络统计 -b

...和

var ipProperties = IPGlobalProperties.GetIPGlobalProperties();

var tcpConnections = ipProperties.GetActiveTcpConnections();

...但我无法重现该错误;并且连接数量始终保持不变。它让我认为连接限制以外的其他原因会导致此错误。

我会在 Azure 中尝试相同的方法;但这似乎不起作用,因为 Kudu 不允许 netstat 或类似命令。

客户端被添加到这样的服务中:

然后注入SenderClient:

SenderClient 本身是从服务提供者那里获取的:

...后来在 Parallel.ForEach 循环中用于分发 http 请求:

SendAsync 在哪里

谁能解释一下可能导致此异常的原因,因为我现在很难长时间尝试解决此问题..?

编辑:我相信我的问题不是这篇文章的重复,因为我使用的是 HttpClientFactory 而不是手动处理客户端。这应该负责管理、刷新和处理连接;并且被认为是处理 http 客户端的首选方式。

使用这种方法,我应该在某个时间段内只拥有一个类型的连接。

0 投票
1 回答
10827 浏览

c# - 如何使用 ConfigurePrimaryHttpMessageHandler 泛型

我想为 Typed HttpClient 添加一个 HttClientHandler 以包含证书身份验证。

我在互联网上找到的所有示例都是这样的:

但是我不想在此处包含获取证书的所有逻辑,因此我想使用ConfigurePrimaryHttpMessageHandler<>的通用版本并编写自己的消息处理程序以将证书包含在请求中。

问题是我很难理解我应该如何实现消息处理程序......我应该从HttpClientHandler继承吗?

请帮忙!

更新

正如我最初怀疑和@Nkosi 确认的那样,从 HttpClient 处理程序派生是在这种情况下要走的路。末尾的代码与此类似:

很重要!

另一方面,在尝试注册我的 http 客户端处理程序时,我注意到它从未被调用过。经过一番谷歌搜索后,我发现目前有一个关于此的开放错误(https://github.com/aspnet/Extensions/issues/851)。因此,在它得到修复之前,您需要以这种方式配置您的处理程序:

0 投票
1 回答
5017 浏览

.net - 使用 Autofac 在 .NET Framework 中注册 IHttpClientFactory DI

.NET 框架版本:4.7.2 Autofac 版本:4.0.1.0

我想在我的 Global.asax 中注册 IHttpClientFactory 但我不能像在 .net 核心中那样使用 services.AddHttpClient 。我需要 IHttpClientFactory 作为我自己的 http 客户端类的依赖项,我需要在我的 webapi 项目中引用它。

这甚至可能吗?如果是,它是如何完成的?

0 投票
1 回答
1600 浏览

c# - 控制台应用程序后台服务中 httpclientfactory 的 DI

我有一个带有简单消费后台服务的控制台程序,该程序需要从使用 HttpClientFactory 的作用域服务调用函数来调用外部 API 并将结果返回给使用后台服务。

在在线查看几个示例以消除代码中所有可能的复杂性之后,我想要非常简单。

一旦我使用 HttpClientFactory 获得 scopedservice,我就会收到以下消息:

尝试激活“Integration.BackgroundService.Services.ScopedServices”时无法解析“System.Net.Http.IHttpClientFactory”类型的服务。

0 投票
0 回答
629 浏览

c# - 将 hangfire BackgroundJob.Schedule 与 httpclientfactory DI 一起使用

我有一个 api,它使用 httpclientfactory 使用 services.addhttpclient<>() 创建不同类型的 httpclients。由于长时间运行的工作,我已经开始将 hangfire 与我的服务集成。在我尝试使用 Hangfires 调度方法“BackgroundJob.Schedule”之前,一切正常。它启动,安排任务,但是当它尝试执行我得到的代码时:

"Unable to resolve service for type 'System.Net.Http.HttpClient' while attempting to activate 'BackupApi.BackupApiService'."

尝试使用 Enqueue 方法时,它可以正常工作。有点丢失自动取款机,非常感谢所有帮助。我的猜测是,当任务安排好以后,当hangfire尝试使用时,依赖项会丢失:

Startup.cs

BackupApiService.cs

BackupApiV1Controller

0 投票
2 回答
476 浏览

javascript - 是否可以将删除/放置请求发送到 Azure AD 安全 api 或使用 aadHttpClientFactory 将 jwt 令牌作为字符串获取

我有一个自定义 Api,我使用 Azure AD 保护了它,如下面的教程: https : //docs.microsoft.com/en-us/sharepoint/dev/spfx/use-aadhttpclient 那很好用。

现在我有以下代码向我的自定义 API 发出 GET 请求(工作):

所以这是我期望的工作方式。但是 aadHttpClientFactory 只支持 GET 和 POST 请求

现在我的想法是使用 jQuery 发出一些 PUT/DELETE 请求并使用我上面得到的 Bearer 令牌(用邮递员及其工作进行测试)。但后来我意识到,我不会那么容易得到令牌。当我 console.log(AadHttpClient.configurations.v1) 我只得到这个: 在此处输入图像描述

当然,我可以将我的 API 更改为使用 POST 而不是 PUT/DELETE,但这会非常难看有没有人知道我如何将令牌作为字符串来使用它进行自定义请求?

0 投票
1 回答
314 浏览

asp.net-core - .net core 2.2 httpclient 工厂未提供完整数据作为响应

我正在为我的航班列表应用程序使用 .net core 2.2,为此我正在使用 wego api。但是,当我使用下面的代码从 wego api 获取航班时,我没有得到完整的响应,但是在邮递员中,我在一个请求中得到了完整的结果集。

有时我没有得到上述代码设置的任何结果。Wego api 没有在这个 api 上提供任何分页或过滤。所以请帮助我实现这一目标。感谢提前。