1

我在本地有一个带有 IIS7 和 IIS express 的 asp.net mvc 3 应用程序,它使用 Application_Error 来记录异常并重定向到自定义错误页面。我的应用程序有不同的区域,只要控制器或操作不匹配,就会调用 application_error,但不是针对该区域。

以下是使用的路由示例:

routes.MapRoute(
            "Default",
            "{region}/{controller}/{action}/{id}",
            new { region = "uk", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { region = new RegionWhitelistConstraint() } // constraint for valid regions
        );

在这种情况下,Application_Error 将被触发 /uk/NotFoundPage 但不会触发 /foo/Home

这里对区域的约束:

public class RegionWhitelistConstraint : IRouteConstraint
{
    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var whiteList = Region.DefaultWhiteList;
        var currentRegionValue = values[parameterName].ToString();
        return whiteList.Contains(currentRegionValue);
    }
}

我已经看到这个问题,它建议添加一条捕获所有路由,但除此之外,我想知道是否有一种触发 Application_Error 的方法,因为它是为控制器或操作完成的。

4

2 回答 2

2

您可以在约束类中抛出异常。这将由 Application_Error 处理:

public class RegionWhitelistConstraint : IRouteConstraint
{
    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var whiteList = Region.DefaultWhiteList;
        var currentRegionValue = values[parameterName].ToString();
        var match = whiteList.Contains(currentRegionValue);

        if (!match)
        {
            throw new HttpException(404, "Not Found");
        }

        return match;
    }
}
于 2012-10-31T13:53:58.087 回答
0

我发现了问题所在:当控制器或操作出错时,它们仍然被路由系统与模式匹配:

        routes.MapRoute(
            "Default",
            "{region}/{controller}/{action}/{id}",
            new { region = "uk", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { region = new RegionWhitelistConstraint() } // constraint for valid regions
        );

但是当该区域不在白名单中时,则不匹配。这使得绕过 application_error。我使用的解决方案是创建一个包罗万象的路线:

        routes.MapRoute(
            "NotFound",
            "{*url}",
            new { region = "uk", controller = "Error", action = "NotFound", id = UrlParameter.Optional }
        );

以及引发 HttpException 的操作:

    [HttpGet]
    public ActionResult NotFound()
    {
        throw new HttpException(404, "Page not found");
    }
于 2012-11-01T09:57:27.093 回答