应用中心,海南网站建设优化排名,网站和app的区别,上海企业服务云下载前言上次#xff0c;我们介绍了应该在业务层实现管道模式响应缓存是ASP.NET Core中很重要的功能#xff0c;它可以存储响应#xff0c;并提供来自缓存的响应#xff0c;以便提高程序性能。响应缓存通常是通过Middleware实现的#xff1a;public static class ResponseCach… 前言上次我们介绍了应该在业务层实现管道模式响应缓存是ASP.NET Core中很重要的功能它可以存储响应并提供来自缓存的响应以便提高程序性能。响应缓存通常是通过Middleware实现的public static class ResponseCachingExtensions
{/// summary/// Adds the see crefResponseCachingMiddleware/ for caching HTTP responses./// /summary/// param nameappThe see crefIApplicationBuilder/./parampublic static IApplicationBuilder UseResponseCaching(this IApplicationBuilder app){if (app null){throw new ArgumentNullException(nameof(app));}return app.UseMiddlewareResponseCachingMiddleware();}
}现在我们改成由业务层实现响应缓存。实现1.引用Nuget包新建WebAPI项目引用需要的Nuget包Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection
Install-Package Newtonsoft.Json2.新增接口新增ICacheableQuery接口表示需要缓存public interface ICacheableQuery
{TimeSpan? SlidingExpiration { get; }
}SlidingExpiration缓存过期时间3.新增缓存管道利用MediatR的IPipelineBehavior功能实现缓存管道public class CachingBehaviorTRequest, TResponse : IPipelineBehaviorTRequest, TResponse where TRequest : ICacheableQuery
{private readonly IDistributedCache _cache;public CachingBehavior(IDistributedCache cache){_cache cache;}public async TaskTResponse Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegateTResponse next){TResponse response;if (request.SlidingExpiration null){return await next();}var key GetCacheKey(request);var cachedResponse await _cache.GetAsync(key, cancellationToken);if (cachedResponse ! null){response JsonConvert.DeserializeObjectTResponse(Encoding.UTF8.GetString(cachedResponse));}else{response await next();var options new DistributedCacheEntryOptions { SlidingExpiration request.SlidingExpiration };var serializedData Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(response));await _cache.SetAsync(key, serializedData, options, cancellationToken);return response;}return response;}
}以TRequest作为缓存Key如果缓存存在则反序列化得到缓存的响应否则执行请求缓存响应。4.使用缓存管道修改WeatherForecastController使用Mediator设置缓存时间为5秒public class WeatherForecastController : ControllerBase
{private readonly IMediator _mediator;public WeatherForecastController(IMediator mediator){this._mediator mediator;}[HttpGet]public async TaskIEnumerableWeatherForecast Get(){return await this._mediator.Send(new GetWeatherForecastQuery()); }
}public class GetWeatherForecastQuery : IRequestIEnumerableWeatherForecast, ICacheableQuery
{public TimeSpan? SlidingExpiration { get; set; } TimeSpan.FromSeconds(5);
}internal class GetWeatherForecastQueryHandler : IRequestHandlerGetWeatherForecastQuery, IEnumerableWeatherForecast
{public async TaskIEnumerableWeatherForecast Handle(GetWeatherForecastQuery request, CancellationToken cancellationToken){await Task.Delay(1000);var rng new Random();return Enumerable.Range(1, 1).Select(index new WeatherForecast{ TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();}
}为了体现效果明显代码里故意加了等待时间。运行程序可以看到第一次请求花了1000多ms而后的请求都很快说明使用了缓存结论在本文中我们学会了使用MediatR实现响应缓存。如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“