MapRoute的行为因URI而异

时间:2016-09-13 02:54:24

标签: asp.net-mvc controller routes .net-4.5

我有一个MVC模式,为了向后兼容网站迁移,我需要支持两个特定的.php文件。 One(mywebsite.com/aFolder/select.php)表现完美:使用正确的操作调用控制器。另一个没有(mywebsite.com/index.php)。在后一种情况下,浏览器只是重定向(或重定向)到mywebsite.com(默认的Home控制器,Index方法)。

我的RouteConfig.cs:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        name: "php2",
        url: "aFolder/select.php",
        defaults: new { controller = "Testtt", action = "Foo" }
        );
    routes.MapRoute(
        name: "php1",
        url: "index.php",
        defaults: new { controller = "Testtt", action = "Foo" }
        );

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

}

我的Web.config:

<system.webServer>
  <handlers>
    <add name="PhpHandler1" path="index.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="PhpHandler2" path="aFolder/select.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

FWIW控制器:

public class TestttController : Controller
{
    public ActionResult Foo()
    {
        return View();
    }
}

(在Foo中设置一个断点会在/aFolder/select.php上被击中而在/index.php上没有被击中)

关于index.php位于根目录而不是使其行为不同的子文件夹。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

经过几个月(开启和关闭)以及过去几天的密集讨论后,我最终找到了另一种方法 - 仍然是URL重写但不是通过使用web.config规则。忽略我的OP - 这对于我需要处理的两个.php页面请求来说要简单得多。这里提供的对某人可能有用。

web.config中的处理程序:

<add name="PhpHandler1" path="index.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PhpHandler2" path="Foo/select.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

的Global.asax.cs:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string fullOriginalpath = Request.Url.ToString();
    if (fullOriginalpath.Contains("index.php"))
    {
        Context.RewritePath("/Redirect/Index");
    }
    [...+select.php, etc...]
}

为简洁起见简化,未显示错误/异常处理。然后是一个名为RedirectHandler的标准控制器,其索引返回ActionResult(或其他)。