.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
相关产品推荐
相关产品推荐

