using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DOAN.ServiceCore.Middleware { public class UtcToLocalMiddleware { private readonly RequestDelegate _next; public UtcToLocalMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 检查是否是GET请求 if (HttpMethods.IsGet(context.Request.Method)) { var query = context.Request.Query; // 获取查询参数集合 var queryParams = new List>(); foreach (var queryParameter in query) { if(queryParameter.Value.Count()>0) { foreach (var value in queryParameter.Value) { if (DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out DateTime utcDate)) { // 转换为本地时间 var localTime = utcDate.ToLocalTime(); queryParams.Add(new KeyValuePair(queryParameter.Key, new StringValues(localTime.ToString("o")))); } else { // 如果不是时间格式,则保持原样添加 queryParams.Add(new KeyValuePair(queryParameter.Key, new StringValues(value))); } } } } // 构建新的 QueryString var newQueryString = string.Join("&", queryParams.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}")); context.Request.QueryString = new QueryString("?" + newQueryString); } // Call the next delegate/middleware in the pipeline await _next(context); } } }