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

基于作用域服务配置HTTPS重定向中间件的实现问题

解决多站点Web应用中基于请求特定配置的条件中间件问题

方案一:改进UseWhen委托,从请求作用域获取服务

你之前的问题核心是在根服务容器中解析了作用域服务IContext,这会导致生命周期冲突。正确的做法是从当前请求的HttpContext.RequestServices中获取作用域服务——它是每个请求专属的服务容器,能安全解析作用域生命周期的服务。

修改后的代码如下:

app.UseWhen(httpContext =>
{
    // 从当前请求的作用域中获取IContext
    var siteContext = httpContext.RequestServices.GetRequiredService<IContext>();
    return siteContext.IsForceHttps;
}, httpApp =>
{
    httpApp.UseHttpsRedirection();
});

这个方法直接复用原生UseWhen中间件,无需自定义中间件,就能实现按站点配置启用HTTPS重定向的需求。

方案二:封装通用条件中间件,复用至其他场景

如果需要把这种“基于请求/会话特定配置启用中间件”的逻辑复用在mini-profiler、请求头转发、SameOrigin设置等场景,可以封装一个通用扩展方法,避免重复编写判断逻辑。

通用扩展方法实现

public static class ApplicationBuilderExtensions
{
    /// <summary>
    /// 根据指定作用域服务的条件,决定是否启用后续中间件配置
    /// </summary>
    public static IApplicationBuilder UseWhenScoped<TService>(this IApplicationBuilder app,
        Func<TService, bool> condition,
        Action<IApplicationBuilder> configureMiddleware)
        where TService : class
    {
        return app.UseWhen(httpContext =>
        {
            // 从当前请求作用域获取服务
            var service = httpContext.RequestServices.GetRequiredService<TService>();
            return condition(service);
        }, configureMiddleware);
    }
}

复用示例

启用HTTPS重定向

app.UseWhenScoped<IContext>(context => context.IsForceHttps, httpApp =>
{
    httpApp.UseHttpsRedirection();
});

激活MiniProfiler

app.UseWhenScoped<IContext>(context => context.EnableMiniProfiler, httpApp =>
{
    httpApp.UseMiniProfiler();
});

设置SameOrigin Cookie策略

app.UseWhenScoped<IContext>(context => context.RequireSameOrigin, httpApp =>
{
    httpApp.UseCookiePolicy(new CookiePolicyOptions
    {
        MinimumSameSitePolicy = SameSiteMode.Strict
    });
});

为什么扩展HttpsRedirectionMiddleware会报错

你尝试扩展原生中间件时遇到的“multiple Invoke instances found”错误,是因为中间件的Invoke/InvokeAsync方法需要符合严格的签名约定。如果自定义中间件类中存在多个符合条件的Invoke方法,或者注册方式不符合ASP.NET Core的中间件发现逻辑,就会触发这个错误。相比之下,使用UseWhen结合请求作用域服务的方式更简洁,也避免了中间件扩展的复杂度。


内容的提问来源于stack exchange,提问作者Mark Redfern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:35:19