7

我正在尝试支持一些遗留 url,并将它们映射到控制器操作。URL 如下所示:

/~Home+Office~Note+Pads.html

这是我的路线:

routes.MapRoute(
    "LegacyCategory",
    "{path}.html",
    new { controller = "LegacyCI", action = "Index", }
);

这是我的控制器处理它们的(开始):

public class LegacyCIController : Controller {
    public ActionResult Index(string path) {
        if (path == "~Address+Labels") {
            return RedirectToAction("Display", "Category", new { id = "AddressLabels" });
        }       
        return RedirectToAction("Index", "Category"); 
    }
}

如果我在 LegacyCIController 中设置断点,并将起始页设置为 XXX.html,则断点命中(并且失败if)并且生活很好。但是,当我尝试将起始页设置为 时~Address+Labels.html,没有命中断点,Chrome 只是呕吐并向我显示一个页面,上面写着“哎呀,这个页面似乎已损坏”。

我在我的机器上通过 IIS 7 运行此页面,而不是 Visual Studio。

这个 URL 是否格式错误以至于常规的 MVC 路由甚至无法处理它,还是我做错了什么?

4

2 回答 2

5

默认情况下,IIS7 会阻止路径中带有 a+的 URL(错误 404.11),您可以通过打开allowDoubleEscapingin来覆盖它web.config

  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="true">
      </requestFiltering>
    </security>
  </system.webServer>

但是,正如 IIS 博客中所解释的,此选项会打开一个潜在的安全漏洞,因此在使用它时要小心:

http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls- contains.aspx

于 2012-04-20T22:39:00.690 回答
0

尝试使用HandleUnknownAction. 在您的控制器中:

protected override void HandleUnknownAction( string actionName ) {
  if( Request.Path == "/~Address+Labels.html" ) {
    RedirectToAction( "Display", "Category" ).ExecuteResult( ControllerContext );
  } else {
    base.HandleUnknownAction( actionName );
  }
}
于 2012-04-20T21:21:19.983 回答