3

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

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

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 } 
    );
}

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

我这样调用 RedirectToAction:

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

它返回这个:

/Account.mvc

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

背景:我处于这种情况是因为在我们将网络服务器升级到 IIS 7.5 后,我开始将我的应用程序转换为使用无扩展名 URL。我没有意识到已经与外部世界共享的应用程序中有很多链接——更改为无扩展会破坏所有这些链接。嗬!应该一个人离开就好了。

4

3 回答 3

1

我个人会使用URL Rewriter。您可以使用 IIS 重写模块将 ASP.NET 旧 URL 重定向到无扩展

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

  <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>
于 2014-02-05T16:13:01.970 回答
0

看起来这里是通过在每个请求的末尾添加 / 来编码您的解决方案 在每个 url 的末尾添加一个斜杠?. 如果还不够,我们可以尝试其他方法:)

于 2014-02-01T22:19:46.213 回答
0

对于任何试图弄清楚这一点的人:问题可能不在于 RedirectToAction 生成了错误的 URL,而实际上是 IIS 没有正确解释该 URL。

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

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

很奇怪吧?

于 2014-02-03T18:45:52.310 回答