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 方法时遇到“无法创建抽象类”异常的任何人,这可能是由于:

在 web.config 声明中使用受限的“路径”(例如 path="/Files/*"),并且 您的项目中存在同名文件夹/路径

【讨论】:

【参考方案5】:

我不认为点是这里的问题。 AFAIK 唯一不应该出现在用户名中的字符是 /

如果没有看到匹配john.lee/details 的路由,很难说出了什么问题,但我猜你有另一个匹配 url 的路由,导致用户详细信息路由无法正确匹配。

我建议使用Glimpse 之类的工具来确定匹配的路线。

【讨论】:

以上是关于ASP.NET MVC Url Route 支持(点)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC Route详解

ASP.NET MVC Route详解

Angular 路由模板 url 是不是支持 ASP.Net MVC 5 项目中的 *.cshtml 文件?

如何在多语言 asp.net MVC 网站的 URL 中支持有语言和无语言的路由

Asp.net MVC3.0用Razor视图如何实现URL伪静态?真诚求教。

是否可以在 ASP.NET MVC 中本地化 URL/路由?