当请求的命名客户端未定义时,使 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 验证失败时更改文本框的 css 类

ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型

未记录 ELMAH 和 ASP.NET MVC 自定义错误

一个能够在Asp.Net和Asp.NetCore之间能够互相通讯的Rpc

ASP.NET Core JWT 和声明

ASP.NET 自定义验证器客户端和服务器端验证未触发