C# .net core HttpClient 优化

当你需要ChatAI服务但无法魔法或没有海外手机号码时,Chat8就是你的解决方案。我们基于OpenAi开发,所有用户内容都会加密,欢迎使用!点击使用:
https://chat.chat826.com/#/register?bronk_on=375671

C# .net core HttpClientFactory 用法
C# .net core HttpClient 优化

达到请求无侵入,httpclient缓存的效果,加强架构高效性

1,引入本地缓存

nuget
1,memorycache
Microsoft.Extensions.Caching.Memory
2,redis
Microsoft.Extensions.Caching.Redis
两者选一个,这里于memorycache为例

2,配置本地缓存

注入缓存
在配置方法:public void ConfigureServices(IServiceCollection services){}

  services.AddMemoryCache();

3,具体实现

添加实体类 CacheHttpClientMessageHanlder并继承 DelegatingHandler
实现内容:
根据响应头决定是否缓存

 /// <summary>
    /// 自定义
    /// </summary>
    public class CacheHttpClientMessageHanlder : DelegatingHandler
    {
        private readonly IMemoryCache _memoryCache;// 本地缓存
        //private readonly IDistributedCache _distributedCache; // 分布式缓存

        public CacheHttpClientMessageHanlder(IMemoryCache memoryCache, 
            IDistributedCache distributedCache)
        {
            _memoryCache = memoryCache;
            //_distributedCache = distributedCache;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // 2、本地缓存
            HttpResponseMessage httpResponseMessage = _memoryCache.Get<HttpResponseMessage>(request.RequestUri.AbsoluteUri);

            // 3、获取响应头中,
            if (httpResponseMessage == null)
            {
                // 2.1、从远程查找
                httpResponseMessage = base.SendAsync(request, cancellationToken).Result;

                // 2.2、是否需要缓存
                CacheControlHeaderValue cacheControl = httpResponseMessage.Headers.CacheControl;
                var NoCache = cacheControl.NoCache;
                var NoStore = cacheControl.NoStore;
                var MaxAge = cacheControl.MaxAge;
                if (!NoCache && !NoStore)
                {
                    // 1、设置缓存过期时间
                    MemoryCacheEntryOptions memoryCacheEntryOptions = new MemoryCacheEntryOptions();
                    memoryCacheEntryOptions.AbsoluteExpirationRelativeToNow = MaxAge; // 过期时间

                    // 2.2、存储到本地缓存中
                    _memoryCache.Set<HttpResponseMessage>(request.RequestUri.AbsoluteUri, httpResponseMessage, memoryCacheEntryOptions);
                }
                return Task.FromResult(httpResponseMessage);
            } else
            {
                // 2.2、是否直接返回缓存数据
                CacheControlHeaderValue cacheControl = httpResponseMessage.Headers.CacheControl;
                var NoCache = cacheControl.NoCache; // 1、是否缓存
                var NoStore = cacheControl.NoStore; // 2、是否存储
                var MaxAge = cacheControl.MaxAge;
                if (!NoCache || !NoStore)
                {
                    return Task.FromResult(httpResponseMessage);
                } else
                {
                    httpResponseMessage = base.SendAsync(request, cancellationToken).Result;

                    return Task.FromResult(httpResponseMessage);
                }
            }
        }
    }

4,配置httpclient,并引入实现内容

在配置方法:public void ConfigureServices(IServiceCollection services){}

 services.AddHttpClient("CacheClient").
                AddHttpMessageHandler<CacheHttpClientMessageHanlder>();// 配置HttpClient

5,使用

先注入
private readonly IHttpClientFactory _httpClientFactory;

具体调用过程

  HttpClient httpClient = _httpClientFactory.CreateClient("CacheClient");
            // 1、相当于直接查询(第三方服务)
var result = httpClient.GetAsync("http://localhost:5000/Seckills").Result;

达到请求无侵入,httpclient缓存的效果,加强架构高效性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值