using System; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Web.Http; using Newtonsoft.Json.Linq; using WebAPI.Utility; public class TokenAppendHandler : DelegatingHandler { protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // 1. 先让请求正常执行到 Action var response = await base.SendAsync(request, cancellationToken); try { // 2. 只处理成功的请求 if (response.IsSuccessStatusCode && response.Content != null) { // 3. 获取旧 token var oldToken = request.Headers.GetValues("token")?.FirstOrDefault(); if (string.IsNullOrEmpty(oldToken)) return response; // 4. 判断是否需要续期 bool needRenew = JWTHelper.TokenAboutToExpire(oldToken); if (!needRenew) return response; // 5. 生成新 token string newToken = JWTHelper.refreshToken(oldToken); // 6. 读取原本的返回数据 var json = await response.Content.ReadAsStringAsync(); JObject obj; if (string.IsNullOrWhiteSpace(json)) obj = new JObject(); else obj = JObject.Parse(json); // 7. 关键:追加 token 字段到返回体 obj["token"] = newToken; // 8. 替换成新的返回内容 response.Content = new StringContent( obj.ToString(), System.Text.Encoding.UTF8, "application/json"); } } catch { } return response; } }