当请求的命名客户端未定义时,使 ASP.NET 核心 IHttpClientFactory 抛出
Posted
技术标签:
【中文标题】当请求的命名客户端未定义时,使 ASP.NET 核心 IHttpClientFactory 抛出【英文标题】:Make ASP.NET core IHttpClientFactory throws when the requested named client is not defined 【发布时间】:2021-10-11 13:52:36 【问题描述】:我正在使用 ASP.NET core 3.1,我正在编写一个 web api,从 Visual Studio 2019 内置的 ASP.NET core web api 模板开始。
我的一项服务依赖于IHttpClientFactory
服务。我正在使用named client consumption pattern。所以,基本上,我有这样的代码:
var client = _httpClientFactory.CreateClient("my-client-name");
我注意到即使使用不存在的 HTTP 客户端的名称,前面的方法调用也能正常工作。 不存在的 HTTP 客户端是指从未在 Startup.ConfigureServices
方法中定义的命名 HTTP 客户端。
换句话说,我希望下面的代码会抛出,但实际上它不会:
// code in Startup.ConfigureServices
services.AddHttpClient("my-client-name", c =>
c.DefaultRequestHeaders.Add("User-Agent", "UserAgentValue");
);
// code in a custom service. I would expect this line of code to throw
var client = _httpClientFactory.CreateClient("not-existing-client");
是否可以配置一个 ASP.NET core 3.1 应用程序,使 IHttpClientFactory
具有 strict 行为,并且像上一个代码一样抛出一个异常,指出请求的命名客户端未定义?
【问题讨论】:
【参考方案1】:是否可以配置一个 ASP.NET core 3.1 应用程序,使 IHttpClientFactory 具有严格的行为,并且像前一个一样的代码会引发异常,说明请求的命名客户端未定义?
基于DefaultHttpClientFactory.Create
的源代码
public HttpClient CreateClient(string name)
if (name == null)
throw new ArgumentNullException(nameof(name));
HttpMessageHandler handler = CreateHandler(name);
var client = new HttpClient(handler, disposeHandler: false);
HttpClientFactoryOptions options = _optionsMonitor.Get(name);
for (int i = 0; i < options.HttpClientActions.Count; i++)
options.HttpClientActions[i](client);
return client;
public HttpMessageHandler CreateHandler(string name)
if (name == null)
throw new ArgumentNullException(nameof(name));
ActiveHandlerTrackingEntry entry = _activeHandlers.GetOrAdd(name, _entryFactory).Value;
StartHandlerEntryTimer(entry);
return entry.Handler;
您所描述的是设计使然。如果客户端名称不存在,则只会为使用的名称添加处理程序。
【讨论】:
感谢分享源代码。因此,在我所描述的意义上,似乎没有办法让工厂变得严格。我会更喜欢不同的行为,以便开发人员能够发现不正确的用法(请求未明确配置的客户端)。在我看来,这是一种无声的失败。以上是关于当请求的命名客户端未定义时,使 ASP.NET 核心 IHttpClientFactory 抛出的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型