在需要使用的類的構造函數注入 IHttpContextAccessor 即可使用;
例如獲取 Origin / Referer 信息:
2、如果不能通過注入的方式來實例化 IHttpContextAccessor,下面我們就來處理這種場景。
背景介紹:提供接口供第三方調用,而接口中其實不做數據處理(暫時),只做轉發並且需要將 Header 信息一並轉發,其實就是實現了一次透傳,而在 ApiActionFilterAttribute 類從 Startup 初始化時就不能獲取到 IHttpContextAccessor,這是就需要通過控制反轉的方式在被調用時再按需實例化。
1 public class ThirdPartyJianweiHttpRegistrarHeaderAttribute : ApiActionFilterAttribute 2 { 3 private readonly IConfigurationRoot _appConfiguration; 4
5 public ThirdPartyJianweiHttpRegistrarHeaderAttribute(IConfigurationRoot appConfiguration) 6 { 7 _appConfiguration = appConfiguration; 8 } 9
10 public override async Task OnBeginRequestAsync(ApiActionContext context) 11 { 12 //從請求中獲取 Header 並注入 WebApiClient Header 中傳遞, context.GetService<IHttpContextAccessor> 實現了 IHttpContextAccessor 實例化。
13 var request = context.GetService<IHttpContextAccessor>().HttpContext.Request; 14 if (request != null) 15 { 16 var headers = request.Headers; 17 if (headers != null) 18 { 19 var keyId = headers["keyId"].FirstOrDefault(); 20 var code = headers["rCode"].FirstOrDefault(); 21 context.RequestMessage.Headers.Add("keyId", keyId); 22 context.RequestMessage.Headers.Add("ts", headers["ts"].FirstOrDefault()); 23 context.RequestMessage.Headers.Add("rCode", code); 24 context.RequestMessage.Headers.Add("signature", headers["signature"].FirstOrDefault()); 25 } 26 } 27 await base.OnBeginRequestAsync(context); 28 } 29
30 public override Task OnEndRequestAsync(ApiActionContext context) 31 { 32 return base.OnEndRequestAsync(context); 33 } 34
35 }