首页 > 解决方案 > 启动后如何创建命名客户端?

问题描述

对于我的应用程序,我需要为 HttpRequests 创建一个命名客户端。我可以在 Startup 中创建一个命名客户端。为了访问它,我注入一个“ IHttpClientFactory ”并从中创建一个客户端。但是客户端需要有一个访问令牌作为授权标头,我无法在 Startup 中创建令牌。因此,我需要一种在 Startup 类之外创建命名客户端的方法。我已经尝试将“ IServiceCollection ”注入控制器。但这不起作用。

或者是否有办法在启动时创建命名客户端后对其进行编辑?

标签: c#asp.net-corehttpclient

解决方案


与@Ruben-J 发布的解决方案类似的解决方案是创建一个自定义 HttpMessageHandler,它为在请求时通过 HttpClient 发出的请求分配一个授权标头。

您可以创建一个自定义 HttpMessageHandler ,它可以分配给 Startup 中的命名 HttpClient ,如下所示:

public class YourHttpMessageHandler : DelegatingHandler
{
    private readonly IYourTokenProviderService _yourTokenProviderService;

    public YourHttpMessageHandler(IYourTokenProviderService yourTokenProviderService) 
        : base()
    {
        _yourTokenProviderService = yourTokenProviderService;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = SendAsyncWithAuthToken(request, cancellationToken);

        if (response.StatusCode == HttpStatusCode.Unauthorized)
        {
            await _yourTokenProviderService.RefreshTokenAsync();

            response = SendAsyncWithAuthToken(request, cancellationToken);
        }

        return response;
    }

    private async Task<HttpResponseMessage> SendWithAuthTokenAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _yourTokenProviderService.Token);

        return await base.SendAsync(request, cancellationToken);
    }
}

然后在 Startup 中配置服务并命名为​​ HttpClient:

public virtual void ConfigureServices(IServiceCollection services) 
{
    ...
    services.AddTransient<IYourTokenProviderService, YourTokenProviderService>();
    services.AddTransient<YourHttpMessageHandler>();

    services.AddHttpClient<IYourNamedHttpClient, YourNamedHttpClient>()
        .AddHttpMessageHandler<YourHttpMessageHandler>();
    ...
}

值得注意的是,Polly 的当前实现AddPolicyHandler也在添加自己的 DelegatingHandler。有关更多背景信息,请参阅有关添加 DelegatingHandler 的Microsoft文档。这里还有来自 Steve Gordon 的精彩系列文章


推荐阅读