ASP.NET MVC Url Route支持(点)

时间:2012-02-14 08:51:14

标签: asp.net asp.net-mvc-3 iis-7 url-routing global-asax

我希望你可以帮助我解决以下问题。

我在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" />

5 个答案:

答案 0 :(得分:58)

将UrlRoutingHandler添加到web.config。这需要你的url更具体一些(f.e./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>

答案 1 :(得分:4)

只需将此部分添加到Web.config,即使pathInfo中有点,指定处理程序也将处理对路径/ {* pathInfo}的所有请求。 (取自ServiceStack MVC Host Web.config示例和此答案https://stackoverflow.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>

答案 2 :(得分:1)

我遇到了同样的问题。所以对我来说最好的解决方案是:

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

答案 3 :(得分:1)

对于使用UrlRoutingHandler方法时遇到“无法创建抽象类”异常的任何人,这可能是由于:

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

答案 4 :(得分:0)

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

如果没有看到匹配john.lee/details的路由,则很难说出错了,但我猜测您有另一条与该网址匹配的路由,导致用户详细信息路由无法正确匹配。

我建议使用像Glimpse这样的工具来确定匹配的路线。