.NET 8.0 MVC如何配置路由以忽略图片请求?
解决.NET 8 MVC路由误匹配静态文件的问题
你的问题出在自定义路由/{landingSlug}/{articleSlug}会把/images/something.jpg这类静态文件请求当成符合规则的路由(images被识别为landingSlug,something.jpg被识别为articleSlug),可以通过以下几种方式解决:
方式一:给路由参数添加正则约束
给articleSlug参数添加正则约束,限制它不能包含点号(静态文件通常带扩展名,会包含点号),这样带扩展名的请求就不会匹配该路由:
app.MapControllerRoute( name: "ArticlePage", pattern: "/{landingSlug}/{articleSlug:regex(^[^.]+$)}", defaults: new { controller = "Article", action = "Index" });
方式二:排除特定前缀的路径
如果静态文件都在固定前缀(比如/images/、/css/)下,可以给路由添加约束,排除这些前缀的请求:
app.MapControllerRoute( name: "ArticlePage", pattern: "/{landingSlug}/{articleSlug}", defaults: new { controller = "Article", action = "Index" }, constraints: new { landingSlug = new NotEqualConstraint("images") });
需要自定义NotEqualConstraint类:
public class NotEqualConstraint : IRouteConstraint { private readonly string _forbiddenValue; public NotEqualConstraint(string forbiddenValue) { _forbiddenValue = forbiddenValue; } public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { return !string.Equals(values[routeKey]?.ToString(), _forbiddenValue, StringComparison.OrdinalIgnoreCase); } }
如果要排除多个前缀,可以扩展这个约束支持多值判断。
方式三:确保静态文件中间件优先级
确认app.UseStaticFiles()在路由配置之前执行,这样静态文件请求会被优先处理,只有当静态文件不存在时才会进入路由匹配。不过这种方式无法解决静态文件路径不存在时的误匹配问题,建议结合前两种方式使用。
内容的提问来源于stack exchange,提问作者Matthew Dresser
相关产品推荐
相关产品推荐

