DotNetCore.SKIT.FlurlHttpCl.../docs/WechatApi/Advanced_IHttpClientFactory.md
2021-07-27 18:37:38 +08:00

3.0 KiB
Raw Blame History

如何在 ASP.NET Core 中与 IHttpClientFactory 集成?


请参阅:

《Microsoft Docs - 使用 IHttpClientFactory 实现复原 HTTP 请求》

《Microsoft Docs - 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求》

《Microsoft Docs - .NET Core 2.1 的新增功能:套接字改进》

当你的项目是运行在 ASP.NET Core 2.1 或更高版本的平台时CLR 已经提供了全新的底层套接字实现,无需你手动干预 HttpClient 的生命周期。

如果你想手动管理 HttpClient,那么可以参考下面基于 DI/IoC 的代码实现:

using Flurl.Http;
using Flurl.Http.Configuration;
using Microsoft.Extensions.Options;
using SKIT.FlurlHttpClient.Wechat.Api;
using SKIT.FlurlHttpClient.Wechat.Api.Models;

public class WechatApiClientFactory
{
    internal class DelegatingFlurlClientFactory : IFlurlClientFactory
    {
        private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;

        public DelegatingFlurlClientFactory(System.Net.Http.IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
        }

        public IFlurlClient Get(Flurl.Url url)
        {
            return new FlurlClient(_httpClientFactory.CreateClient(url.ToUri().Host));
        }

        public void Dispose()
        {
            // Do Nothing
        }
    }

    private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
    private readonly IOptions<WechatApiClientOptions> _wechatApiClientOptions;

    public WechatApiClientFactory(
        System.Net.Http.IHttpClientFactory httpClientFactory,
        IOptions<WechatApiClientOptions> wechatApiClientOptions)
    {
        _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
        _wechatApiClientOptions = wechatApiClientOptions ?? throw new ArgumentNullException(nameof(wechatApiClientOptions));

        Flurl.Http.FlurlHttp.GlobalSettings.FlurlClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory);
    }

    public WechatApiClient CreateClient()
    {
        return new WechatApiClient(_wechatApiClientOptions.Value);
    }
}

需要强调的是,虽然 WechatApiClient 实现了 System.IDisposable 接口,但你不应该在 DI/IoC 中手动释放它,而是应该交给 IoC 容器自动管理它。

此外你应注意,System.Net.Http.IHttpClientFactoryFlurl.Http.Configuration.IHttpClientFactory 是两个不同的类型,使用时请加以区分