.NET Core 获取 Request/Headers 等信息

 

在需要使用的类的构造函数注入 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 }

 

 

 

 

posted @ 2020-03-01 15:55  殇琉璃  阅读(4894)  评论(0编辑  收藏  举报