ASP.NET MVC Url Route 支持(点)
Posted
技术标签:
【中文标题】ASP.NET MVC Url Route 支持(点)【英文标题】:ASP.NET MVC Url Route supporting (dot) 【发布时间】:2012-03-05 15:35:42 【问题描述】:希望您能帮我解决以下问题。
我在 IIS7 上使用 ASP.NET MVC 3,并希望我的应用程序支持带点的用户名。
示例:http://localhost/john.lee
这就是我的 Global.asax 的样子:(http://localhost/username)
routes.MapRoute(
"UserList",
"username",
new controller = "Home", action = "ListAll"
);
当我访问其他页面(例如 http://localhost/john.lee/details 等)时,应用程序可以正常工作。
但是主用户页面不起作用,我希望该应用能够像支持 http://www.facebook.com/john.lee 的 Facebook 一样工作。
我使用了下面的代码,但它根本不适合我:
<httpRuntime relaxedUrlToFileSystemMapping="true" />
我能够使用下面的代码并让应用程序接受点,但由于许多不同的原因我绝对不想使用下面的代码,请告诉我有办法解决这个问题。
<modules runAllManagedModulesForAllRequests="false" />
【问题讨论】:
***.com/questions/8163401/dot-symbol-in-url 我有同样的问题,但在 IIS 6 中。 我无法重现该问题。它适用于 IIS Express(因此它也适用于 IIS 7.0+)。此外,您似乎在指示/john.lee/details
形式的 url,但根据您的路由定义,您无法指定操作。它将始终使用ListAll
操作。所以问题与这里的点并没有真正的关系。可能更多的是关于你的路线。
不,达林,你误解了我,localhost/john.lee 正在使用上述路线(ListAll),但 /john.lee/details 使用的是不同的路线,但不知何故,它有效。我认为这与 IIS 有关,通过在用户名上启用一个点,它将允许类似 localhost/default.aspx 的内容(default.aspx 是用户名,而不是根文件夹上的文件)。我真的需要想办法解决这个问题。
基本上通过在用户名上启用点,某人的用户名可能是 default.aspx,而另一个人的用户名可能是 john.lee,但 IIS 会因为我按下而感到困惑?
【参考方案1】:
将 UrlRoutingHandler 添加到 web.config。但是,这需要您的网址更加具体(例如 /Users/john.lee)。 这会强制以 /Users 开头的每个 url 都被视为 MVC url:
<system.webServer>
<handlers>
<add name="UrlRoutingHandler"
type="System.Web.Routing.UrlRoutingHandler,
System.Web, Version=4.0.0.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
path="/Users/*"
verb="GET"/>
</handlers>
</system.webServer>
【讨论】:
我的 api 控制器需要这个,它就像一个魅力! 非常优雅的解决方案。谢谢! 谢谢!我能够用它来解决***.com/questions/11728846/… 和***.com/questions/9331516/… 我真的不明白这是怎么回事;Cannot create an abstract class.
pastebin.com/vuQ2WnWZ
起初我认为这不起作用,然后我意识到我将它放在 ~/Views/web.config 而不是 ~/web.config 中。惭愧,您必须放置完整的绝对路径,尤其是当应用程序的部署虚拟目录可能发生变化时。【参考方案2】:
只需将此部分添加到 Web.config 中,对 route/*pathInfo 的所有请求都将由指定的处理程序处理,即使 pathInfo 中有点。 (取自 ServiceStack MVC Host Web.config 示例和这个答案https://***.com/a/12151501/801189)
这应该适用于 IIS 6 和 7。您可以通过修改 'add' 元素中的 path="*" 将特定的处理程序分配给 'route' 之后的不同路径
<location path="route">
<system.web>
<httpHandlers>
<add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
</httpHandlers>
</system.web>
<!-- Required for IIS 7.0 -->
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</location>
【讨论】:
这似乎和使用 System.Web.Routing.UrlRoutingHandler 一样有效 - 我只是不确定哪个更好或更有效 - UrlRoutingHandler 似乎专门针对路由。 那么,谁能解释一下 TransferRequestHandler 和 UrlRoutingHandler 之间的实际区别是什么?应该首选哪一个? 2017年还有人使用IIS7栈吗!? .NET Core 和 Kestrel 好多了!【参考方案3】:我遇到了同样的问题。所以对我来说最好的解决方案是:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"></modules>
<system.webServer>
【讨论】:
【参考方案4】:对于在使用UrlRoutingHandler
方法时遇到“无法创建抽象类”异常的任何人,这可能是由于:
path="/Files/*"
),并且
您的项目中存在同名文件夹/路径
【讨论】:
【参考方案5】:我不认为点是这里的问题。 AFAIK 唯一不应该出现在用户名中的字符是 /
如果没有看到匹配john.lee/details
的路由,很难说出了什么问题,但我猜你有另一个匹配 url 的路由,导致用户详细信息路由无法正确匹配。
我建议使用Glimpse 之类的工具来确定匹配的路线。
【讨论】:
以上是关于ASP.NET MVC Url Route 支持(点)的主要内容,如果未能解决你的问题,请参考以下文章
Angular 路由模板 url 是不是支持 ASP.Net MVC 5 项目中的 *.cshtml 文件?
如何在多语言 asp.net MVC 网站的 URL 中支持有语言和无语言的路由