.mvc和无扩展名URL的MVC路由

时间:2013-10-29 15:50:58

标签: asp.net-mvc asp.net-mvc-3 .net-4.0 iis-7.5

我有一个奇怪的问题。我正在开发一些设置为无扩展的MVC代码,如/Home/Index?id=10中所示。但是,它曾经是为IIS 6设置的,并且在所有控制器上使用.mvc扩展名,如{{1} }}

我希望两条路线都能正常工作。在我的global.asax.cs文件中,我创建了以下代码:

/Home.mvc/Index?id=10

几乎有效!但不幸的是,当我的控制器返回RedirectToAction时,生成的URL失败。

我这样调用RedirectToAction:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute("Default2",
                    "{controller}.mvc/{action}/{id}",
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    routes.MapRoute("Default", 
                    "{controller}/{action}/{id}", 
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );
}

然后返回:

return RedirectToAction("Index", "Account");

现在假设索引,所以我并不担心这个缺失。但是,该URL末尾没有/Account.mvc ,因此,它返回404错误。如果我添加/它可以正常工作。有什么方法可以帮助MVC正确生成URL,还是有办法修改路由以使其识别此URL?

背景:我遇到这种情况是因为在我们将网络服务器升级到IIS 7.5之后,我开始将我的应用程序转换为使用无扩展名的URL。我没有意识到与外部世界共享的应用程序有很多链接 - 改为无扩展程序打破了所有这些链接。卫生署!应该留下足够好的。

3 个答案:

答案 0 :(得分:1)

我个人会使用URL Rewriter。你可以Redirect ASP.NET Legacy URLs to Extensionless with the IIS Rewrite Module

例如,您可以创建一个类似的出站规则(不完全是,它们肯定需要测试):

  <outboundRules>
    <rule name="remove .mvc outbound 1">
      <match serverVariable="RESPONSE_LOCATION" 
             pattern="^/(.*).mvc$" />
      <action type="Rewrite" value="/{R:1}" />
    </rule>
    <rule name="remove .mvc outbound 2">
      <match filterByTags="A, Form, IFrame, Img, Input, Link, Script" 
             pattern="^/(.*).mvc$" />
      <action type="Rewrite" value="/{R:1}" />
    </rule>
  </outboundRules>

如果有人决定对MVC扩展程序进行硬编码......

    <rule name="Add Slash Inbound">
      <match url="(.*)" />
      <conditions>
        <add input="{PATH_INFO}" pattern="^/(.*).mvc$" negate="true" />
      </conditions>
      <action type="Rewrite" url="{R:0}/" />
    </rule>

答案 1 :(得分:0)

通过在每个请求Add a trailing slash at the end of each url?的末尾添加/,在此处编写您的解决方案。如果还不够我们可以尝试别的东西:)

答案 2 :(得分:0)

对于任何想要解决这个问题的人:问题可能不是RedirectToAction正在生成错误的URL,而是实际上IIS没有正确解释该URL。

我发现其他服务器在原始问题中描述的URL中缺少斜杠没有问题。

这让我看看App Pool设置。特别是一个设置似乎会影响这一点:“启用32位应用程序”。在应用程序池上将此设置为true,使我的应用程序能够解析缺少尾随'/'。

的URL

怪啊?