当你需要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;