You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义HttpRequestInterceptor中访问app.Environment?

在自定义HttpRequestInterceptor中访问开发环境状态

要在你的HttpRequestInterceptor里判断是否是开发环境,最直接的方式就是利用ASP.NET Core的依赖注入体系,把环境服务注入进来,或者从HttpContext的服务容器里获取。

方案一:构造函数注入IWebHostEnvironment(推荐)

这种方式符合依赖注入的设计原则,代码更清晰也便于测试:

  1. 修改自定义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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:22:12