ASP.NET MVC支持(dot)的URL路由

39

希望您能帮助我解决以下问题。

我正在使用ASP.NET MVC 3在IIS7上,并希望我的应用程序支持带有点的用户名。

例如:http://localhost/john.lee

这是我的Global.asax文件的内容:(http://localhost/{username})

routes.MapRoute(
    "UserList",
    "{username}",
    new { controller = "Home", action = "ListAll" }
);

当我访问其他页面(比如http://localhost/john.lee/details等)时,该应用程序可以正常工作。

但主用户页面不起作用,我希望应用程序像Facebook一样支持http://www.facebook.com/john.lee

我尝试使用以下代码,但没有起作用:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

我能够使用下面的代码并让应用接受点号,但出于许多不同的原因,我绝对不想使用下面的代码,请告诉我是否有一种方法可以解决这个问题。

<modules runAllManagedModulesForAllRequests="false" />

1
我有同样的问题,但是在IIS 6中。 - Chuck Norris
1
我无法重现这个问题。在我的IIS Express中它可以工作(所以它应该也能在IIS 7.0+中工作)。另外,你似乎指定了一个形如/john.lee/details的URL,但根据你的路由定义,你不能指定一个操作。它将始终使用ListAll操作。因此,问题实际上与这里的点没有关系。它可能更多地涉及到你的路由。 - Darin Dimitrov
1
不好意思,Darin,你误解了我的意思。http://localhost/john.lee 使用的是上面提到的路由(ListAll),但 /john.lee/details 当然使用了不同的路由,但它仍然能够正常工作。我认为这与 IIS 有关,通过允许用户名中包含点号,它可以允许像 localhost/default.aspx 这样的东西(default.aspx 是一个用户名而不是根文件夹中的文件)。我真的需要找到一个解决办法。 - Cindro
1
基本上,通过在用户名上启用点号,某人的用户名可以是default.aspx,而另一个人的用户名可以是john.lee,但我想IIS会感到困惑,对吗? - Cindro
可能是Dots in URL causes 404 with ASP.NET mvc and IIS的重复问题。 - Tolga Evcimen
显示剩余4条评论
5个回答

63

在web.config中添加一个UrlRoutingHandler。但这需要你的URL更加具体一些 (例如:/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控制器,它非常好用! - batzen
非常优雅的解决方案。谢谢! - Ivan Stoyanov
谢谢!我能够使用这个来解决https://dev59.com/PGgt5IYBdhLWcg3w5xg_和https://dev59.com/yGox5IYBdhLWcg3wQSAO。 - user1454265
4
我不太明白这是怎么回事;无法创建抽象类。http://pastebin.com/vuQ2WnWZ - Korijn
起初我以为这个不起作用,后来才意识到我把它放在了/Views/web.config而不是/web.config。很遗憾,你必须输入完整的绝对路径,特别是当应用程序的部署虚拟目录可能会更改时。 - danludwig
显示剩余2条评论

4
只需将此部分添加到Web.config中,所有对route / {* pathInfo}的请求都将由指定的处理程序处理,即使pathInfo中有点也是如此。(摘自ServiceStack MVC Host Web.config示例和此答案 https://dev59.com/PGgt5IYBdhLWcg3w5xg_#12151501)。这对IIS 6和7都适用。您可以通过修改'add'元素中的path =“*”在“路由”之后为不同的路径分配特定的处理程序。
  <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>

2
这似乎和使用System.Web.Routing.UrlRoutingHandler一样有效 - 我只是不确定哪个更好或更高效 - UrlRoutingHandler似乎专门针对路由。 - Ripside
那么,有人能解释一下TransferRequestHandler和UrlRoutingHandler之间的实际区别吗?哪一个应该被优先选择? - Serg
在2017年,还有人使用IIS7堆栈吗?.NET Core和Kestrel要好得多! - V.B.

2

我曾经遇到过同样的问题,所以对我来说最好的解决方案是:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
<system.webServer>

1

如果使用UrlRoutingHandler方法时出现“无法创建抽象类”异常,可能是由于以下原因:

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

0

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

没有看到匹配john.lee/details的路由,很难说出错了什么,但我猜测你有另一个匹配该URL的路由,导致用户详细信息路由未能被正确匹配。

我建议使用Glimpse等工具来确定正在匹配的路由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接