具有特殊字符的MVC路由

时间:2012-04-20 18:09:42

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

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

/~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。

这个网址是否格外错误,以至于普通的MVC路由甚至无法处理它,或者我做错了什么?

2 个答案:

答案 0 :(得分:5)

默认情况下,IIS7会阻止路径中包含+的网址(错误404.11),您可以通过启用web.config中的allowDoubleEscaping来覆盖此内容:

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

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

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

答案 1 :(得分:0)

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

protected override void HandleUnknownAction( string actionName ) {
  if( Request.Path == "/~Address+Labels.html" ) {
    RedirectToAction( "Display", "Category" ).ExecuteResult( ControllerContext );
  } else {
    base.HandleUnknownAction( actionName );
  }
}