应用程序错误不解雇404页时,额外的自定义细分(Application Error not fire

2019-10-17 08:25发布

我有IIS7和IIS表达对地方,这是使用的Application_Error用于记录异常和重定向到一个自定义错误页一个asp.net MVC 3应用程序。 我的应用程序有不同的区域,每当控制器或动作不匹配的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会被解雇/英国/ NotFoundPage但不适用于/富/主页

这里该地区的约束:

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,因为它是在控制器或动作做的一种方式。

Answer 1:

你可以扔在你的约束类异常。 这将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;
    }
}


Answer 2:

我想通了什么问题:当一个控制器或者一个动作是错误的,他们仍然通过路由系统与模式匹配:

        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");
    }


文章来源: Application Error not fired for 404 page when extra custom segment