1

ローカルでIIS7とIISExpressを使用するasp.netmvc3アプリケーションがあります。これは、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 に答える