using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives;
using SBF.Common.Models;
namespace SBF.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; }
}
}