创建Catch-All路线

时间:2013-01-19 23:31:30

标签: asp.net-mvc-4 routes

我在网上找到了几个例子(特别是在StackOverflow上),用于在ASP.NET MVC中创建一个包含所有路径,但这似乎对我在MVC4中没有用处:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("elfinder.connector");

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

    routes.MapRoute(
        name: "CatchAll",
        url: "{*url}",
        defaults: new { controller = "Home", action = "CatchAll" }
    );

}

控制器操作定义为:

    public ActionResult CatchAll(string url)
    {
        // catch the URL and use it for something
    }

此处的目标是拦截所有可能的404错误,并根据URL,使用404或其他内容进行响应。但是,我从未在CatchAll操作中结束,我只获得了以下网址的默认404:

  • 〜/富
  • 〜/这个/是/一个/测试/ URL

我在这里做错了吗?我想避免必须抓住Application_Error中的错误,如果它是404,则从那里重新转发。它看起来有点混乱。在我看来,处理这些请求的正确方法是简单地将它们路由到正确的操作,不是吗?

更新虽然我的网址纯粹主义者希望避免使用Response.Redirect,但我目前正在尝试将以下内容作为请求的全局搜索:

protected void Application_Error()
{
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;

    if (httpException != null)
        if (httpException.GetHttpCode() == 404)
        {
            Server.ClearError();
            Response.Redirect(String.Format("~/Home/CatchAll/?url={0}", Request.Path));
        }
}

但是,这仅在URL的结构与路径匹配时才有效。否则看起来IIS甚至不会将请求发送到应用程序,它只是直接返回404。我需要一个全局处理程序,其中任何未映射到某个动作的网站所请求的URL都会被定向。

更新:看起来两件事的组合应该对我有用。首先,在Application_Error(或Application_EndRequest中捕获404,正如某些人所建议的那样,无论哪种方式都符合我的需要)涵盖了与路径结构匹配但未找到动作的任何内容。但是,仍然存在与路由结构不匹配的请求。

由于各种原因,我不想为此调整IIS。解决方案应包含在应用程序本身中。幸运的是,我可以保证最新的.NET和IIS,它允许我使用Web.config设置来指示IIS如何处理错误。所以我现在正在尝试这个:

<httpErrors errorMode="Custom" defaultResponseMode="Redirect" defaultPath="/Home/CatchAll">
  <clear/>
</httpErrors>

然而,这似乎并不完全正确。 影响IIS,因为错误响应已更改,但它仍然是错误响应。这是:

  

HTTP错误500.19 - 内部服务器错误

     

无法访问请求的页面,因为页面的相关配置数据无效。

所以看起来我走在正确的轨道上,我很难找到在httpErrors中使用Web.config发送所有404(或甚至所有错误)的工作示例,这对我的行动没什么影响。

0 个答案:

没有答案
相关问题