在 ASP.NET MVC 中强制区分大小写路由

Posted

技术标签:

【中文标题】在 ASP.NET MVC 中强制区分大小写路由【英文标题】:Force case-sensitive routing in ASP.NET MVC 【发布时间】:2012-10-12 21:35:35 【问题描述】:

在previously Stack Overflow 和elsewhere 上以类似但不相同的方式提出了这个问题(并且没有让我满意)。

来自 linux 世界,我想使用 ASP.NET MVC,但要避免相同但大小写不同的路由解析到同一页面。我确实想强制所有路由为 100% 小写。

例如我希望/Home/Something 成为有效路线,/Home/somethingElse 也成为有效路线,但不是/Home/something/home/somethingelse,给定SomethingsomethingElse 中的两个函数HomeController

我在 RegisterRoutes 函数中找不到任何方法,但也许我遗漏了一些明显的东西?我可以通过向每个 Controller 函数添加代码来轻松回答这个问题,但我显然试图避免这样做。

理想情况下,解决方案将涉及捕获特定路由的所有个排列,然后 301 重定向任何与控制器功能的情况不完全匹配的排列。

【问题讨论】:

MVC 和 ASP.NET Webforms 都可以使用相同的路由引擎。 值得注意的是,您没有指明 C# 或 VB.Net - VB.Net 天生不区分大小写。 【参考方案1】:

经过大量搜索后,我无法找到 任何 方法。基本上,区分大小写和 IIS/ASP.NET 显然不能同时使用。

我们现在正在使用一些杂项来解决这个问题。代码已在 github 上开源(MIT 许可):NeoSmart Web Toolkit,尤其是this file containing the SEO redirect code。

使用起来很简单:控制器类中的每个 GET 方法只需要在开头添加这一行:

Seo.SeoRedirect(this);

SEO 重写类自动使用 C# 5.0 的 Caller Info 属性来完成繁重的工作,使上面的代码严格复制和粘贴。

理想情况下,我很想找到一种方法将那行代码变成一个属性。例如,在控制器方法前加上 [CaseSensitive] 会自动产生与在该行中写入相同的效果,但可惜,我(尚)不知道该怎么做。

我也找不到任何用Routing 类/结构来解决这个问题的方法。这是一些不透明的代码!

【讨论】:

以上是关于在 ASP.NET MVC 中强制区分大小写路由的主要内容,如果未能解决你的问题,请参考以下文章

由于不区分大小写的 URL 和默认值,如何避免 ASP.NET MVC 中的重复内容?

ASP.NET MVC 执行流程?

ASP.NET Core Razor Pages 强制 Anchor Tag Helper (asp-page) 使用小写路由

如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')?

ASP.NET MVC学习之模型绑定

ASP.NET MVC教程五:ASP.NET MVC中的路由