我正在尝试支持一些遗留网址,并将它们映射到控制器操作。网址如下所示:
/~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路由甚至无法处理它,或者我做错了什么?
答案 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 );
}
}