如何在自定义HttpRequestInterceptor中访问app.Environment?
在自定义HttpRequestInterceptor中访问开发环境状态
要在你的HttpRequestInterceptor里判断是否是开发环境,最直接的方式就是利用ASP.NET Core的依赖注入体系,把环境服务注入进来,或者从HttpContext的服务容器里获取。
方案一:构造函数注入IWebHostEnvironment(推荐)
这种方式符合依赖注入的设计原则,代码更清晰也便于测试:
- 修改自定义Interceptor的构造函数,注入
IWebHostEnvironment:
public class HttpRequestInterceptor : DefaultHttpRequestInterceptor { private readonly IWebHostEnvironment _hostEnv; // 通过构造函数注入环境服务 public HttpRequestInterceptor(IWebHostEnvironment hostEnv) { _hostEnv = hostEnv; } public override ValueTask OnCreateAsync(HttpContext context, IRequestExecutor requestExecutor, IQueryRequestBuilder requestBuilder, CancellationToken cancellationToken) { // 判断是否为开发环境,执行模拟认证 if (_hostEnv.IsDevelopment()) { // 这里写你的模拟认证逻辑,比如给当前上下文设置测试用户 var testClaims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, "1"), new Claim(ClaimTypes.Name, "DevTestUser"), new Claim(ClaimTypes.Role, "Admin") }; context.User = new ClaimsPrincipal(new ClaimsIdentity(testClaims, "MockAuthentication")); } // 必须调用基类的方法,保证原有流程正常执行 return base.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken); } }
- 在Program.cs中注册Interceptor时,DI容器会自动注入
IWebHostEnvironment(它默认已经注册在容器中):
builder.Services.AddGraphQLServer() .AddHttpRequestInterceptor<HttpRequestInterceptor>();
方案二:从HttpContext的服务容器中获取
如果因为某些原因无法修改Interceptor的构造函数,可以直接从当前HttpContext的服务容器中获取环境服务:
public override ValueTask OnCreateAsync(HttpContext context, IRequestExecutor requestExecutor, IQueryRequestBuilder requestBuilder, CancellationToken cancellationToken) { var hostEnv = context.RequestServices.GetRequiredService<IWebHostEnvironment>(); if (hostEnv.IsDevelopment()) { // 执行模拟认证逻辑 } return base.OnCreateAsync(context, requestExecutor, requestBuilder, cancellationToken); }
两种方式都能实现需求,优先推荐构造注入的方式,它的代码耦合度更低,也更符合ASP.NET Core的设计规范。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

