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

.NET Core 1.0.4应用MapWhen异常:所有请求进入API认证分支

问题分析与解决方案

嘿,我一眼就瞅出问题所在了——你在MapWhen的分支配置里犯了个关键错误:你用了外部的app实例来注册中间件,而不是MapWhen传入的appBuilder分支构建器!

错误原因详解

MapWhen的作用是创建一个分支管道,只有当匹配条件(这里是路径以/api开头)满足时,才会走这个分支里的中间件。但你现在在lambda里写的是:

app.UseMiddleware<BasicAuthenticationMiddleware>();
app.UseMvc();

这相当于把这两个中间件注册到了整个应用的全局管道里,而不是仅/api路径的分支管道。所以不管请求路径是什么,都会经过Basic Auth中间件,自然整个站点都异常了。

修正后的代码

把分支里的app换成MapWhen传入的appBuilder,同时为API单独配置Mvc路由,避免和主站点的路由冲突:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
    // 仅对/api开头的请求启用Basic Auth
    app.MapWhen(context => context.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase), appBuilder => {
        // 这里要用appBuilder,不是外部的app!
        appBuilder.UseMiddleware<BasicAuthenticationMiddleware>();
        // 为API配置单独的Mvc路由
        appBuilder.UseMvc(routes => {
            routes.MapRoute(
                name: "api",
                template: "api/{controller=Home}/{action=Index}/{id?}");
        });
    });

    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
    } else {
        app.UseExceptionHandler("/site/error");
    }

    app.UseStaticFiles();
    app.UseIdentity();
    app.UseDefaultFiles();
    app.UseStatusCodePages();
    app.UseSession();
    app.UseMvc(routes => {
        routes.MapRoute(
            name: "default",
            template: "{controller=Site}/{action=Login}/{id?}");
    });
}

额外注意事项

  • API路由隔离:建议给你的API控制器加上[Route("api/[controller]")]特性,这样分支里的Mvc路由会更清晰,也不会和主站点路由混淆。
  • 中间件顺序:确保MapWhen的分支配置放在主Mvc之前,这样分支管道能优先匹配/api请求,不会被主Mvc的路由先拦截。
  • .NET Core 1.0.4兼容性:这个版本的MapWhen行为和后续版本一致,只要正确使用appBuilder就没问题。

这样修改后,只有路径以/api开头的请求才会进入Basic Auth分支,主站点的请求会走原来的管道,不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:50