使 ASP.NET 核心 IHttpClientFactory 在未定义请求的命名客户端时抛出

Make ASP.NET core IHttpClientFactory throws when the requested named client is not defined

我正在使用 ASP.NET 核心 3.1,我正在编写一个网络 api,从 Visual Studio 2019 内置 ASP.NET 核心网络 api模板。

我的一项服务依赖于 IHttpClientFactory 服务。我正在使用 named client consumption pattern。所以,基本上,我有这样的代码:

var client = _httpClientFactory.CreateClient("my-client-name");

我注意到即使使用不存在的 HTTP 客户端的名称,先前的方法调用也能正常工作。 不存在的 HTTP 客户端 我的意思是一个命名的 HTTP 客户端,它从未在 Startup.ConfigureServices 方法中定义。

换句话说,我希望下面的代码能够抛出,但实际上并没有:

// 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 核心 3.1 应用程序,以便 IHttpClientFactory 具有 strict 行为并且像前一个一样的代码抛出异常声明请求的命名客户端未定义?

Is it possible to configure an ASP.NET core 3.1 application so that the IHttpClientFactory has a strict behavior and code like the previous one throws an exception stating that the requested named client is not defined?

基于 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;
}

您所描述的是设计使然。如果客户端名称不存在,将为使用的名称添加一个处理程序。