using BBWY.Common.Models; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BBWY.Server.API.Middlewares { public class ClientVersionValidationMiddleWare { /// /// 管道请求委托 /// private RequestDelegate _next; private IDictionary apiVersionDictionary; private IOptionsMonitor> _monitor; public ClientVersionValidationMiddleWare(RequestDelegate requestDelegate, IOptionsMonitor> monitor) { _next = requestDelegate; _monitor = monitor; apiVersionDictionary = new Dictionary(); } public async Task Invoke(HttpContext context) { try { Console.WriteLine(context.Request.Path); var apiRequirement = _monitor.CurrentValue.FirstOrDefault(x => x.Api.Equals(context.Request.Path, StringComparison.CurrentCultureIgnoreCase)); if (apiRequirement != null) { if (!context.Request.Headers.TryGetValue("ClientVersion", out StringValues clientVersionStr)) throw new BusinessException("缺少版本信息,请更新步步为盈"); if (!int.TryParse(clientVersionStr, out int clientVersion)) throw new BusinessException("版本信息不正确,请更新步步为盈"); if (clientVersion < apiRequirement.MinimumVersion) throw new BusinessException("当前请求需更新步步为盈~!"); } await _next(context); //调用管道执行下一个中间件 } catch { throw; } } } public class ClientVersionValidationModel { public string Api { get; set; } public int MinimumVersion { get; set; } } }