.NET Core 2如何配置通配路由并忽略指定目录?
嘿,这个场景我在迁移旧WebForms系统到.NET Core的时候也遇到过!你的通配路由{*url}确实会捕获所有未匹配的请求,要忽略特定目录的话,有几种实用的方案,根据你的需求选就行:
方案1:添加前置路由直接忽略目标目录
路由匹配是按顺序来的,我们可以在你的通配路由前面,先添加一个匹配要忽略目录的路由,用NullRouter直接终止请求的路由处理,这样这些请求就不会走到NodeHandler了。
比如你要忽略/static目录,代码可以这么写:
routes.MapRoute( name: "IgnoreStaticDirectory", template: "static/{*path}", // 替换成你要忽略的目录,比如"assets/{*path}"或"admin/{*path}" handler: new Microsoft.AspNetCore.Routing.NullRouter() ); // 你的原有通配路由放在后面 routes.MapRoute( name: "NodeHandler", template: "{*url}", defaults: new { controller = "Node", action = "Index" } );
原理很简单:当请求路径以/static开头时,会先匹配到这个前置路由,NullRouter会告诉系统这个路由不处理请求,也不会继续往下匹配其他路由,自然就跳过了你的通配路由。
方案2:利用静态文件中间件(如果忽略的是静态资源目录)
如果要忽略的目录是存放静态文件(比如css、js、图片)的,那更推荐用静态文件中间件来处理。只需要把静态文件中间件放在MVC中间件前面,让它优先处理这些目录的请求:
在Startup.cs的Configure方法里调整顺序:
// 先配置静态文件中间件,指定要处理的目录 app.UseStaticFiles(new StaticFileOptions { RequestPath = "/static" // 你的目标静态目录路径 }); // 再注册MVC路由 app.UseMvc(routes => { routes.MapRoute( name: "NodeHandler", template: "{*url}", defaults: new { controller = "Node", action = "Index" } ); });
这样当请求/static下的资源时,静态文件中间件会直接返回文件内容,根本不会进入MVC的路由流程,完美跳过你的通配路由。
方案3:用自定义路由约束排除特定路径
如果不想添加额外路由,也可以给通配路由加一个正则约束,直接排除目标目录的路径。
首先定义一个正则路由约束类:
public class RegexRouteConstraint : IRouteConstraint { private readonly Regex _regexPattern; public RegexRouteConstraint(string pattern) { _regexPattern = new Regex(pattern, RegexOptions.IgnoreCase); } public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (values.TryGetValue(routeKey, out var value) && value is string urlPath) { // 匹配除了目标目录开头之外的所有路径 return _regexPattern.IsMatch(urlPath); } return false; } }
然后在路由配置里使用这个约束:
routes.MapRoute( name: "NodeHandler", template: "{*url}", defaults: new { controller = "Node", action = "Index" }, constraints: new { url = new RegexRouteConstraint(@"^(?!static\/).*$") } );
这里的^(?!static\/)是正则的负向预查,意思是路径不能以static/开头,这样就会自动排除这个目录下的所有请求。
个人更推荐方案1或方案2,方案1适合非静态目录的场景,方案2针对静态资源更高效。
内容的提问来源于stack exchange,提问作者user2435866
相关产品推荐
相关产品推荐

