MVC管道如何工作?

时间:2013-01-11 10:42:00

标签: asp.net-mvc

有人可以为我澄清这种情况:

  1. 我们请求例如Home \ Index;
  2. 在Global asax中,我们有Application_AuthorizeRequest
  3. Application_AuthorizeRequest抛出异常
  4. 我们有Application_Error捕获它并返回新视图

    IController controller = new ErrorController(); // routedata没问题 controller.Execute(new RequestContext(new HttpContextWrapper(Context),routeData));

  5. 执行错误操作(没关系)

  6. 但是MVC或ASP管道仍然尝试执行Home \ Index,怎样才能让管道忘记请求?
  7. 据我所知,mvc是HttpHandler,我怎样才能确保我的错误操作是所有链中的最后一步?

1 个答案:

答案 0 :(得分:1)

此设置存在问题。如果要阻止调用Index操作,则应编写自定义Authorize属性,而不是使用Authenticate_Request事件:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // perform the logic you were doing in your Authenticate_Request
        // here to authorize the user. You could throw exceptions as well
        throw new Exception("ok");
    }
}

授权过滤器替换了ASP.NET MVC应用程序中的Authenticate_Request方法,这就是您应该使用的方法。

然后使用此属性修饰您的Index操作:

public class HomeController: Controller
{
    [MyAuthorize]
    public ActionResult Index()
    {
        ...    
    }
}

现在,您的Application_Error将被调用,错误控制器将被执行,而索引操作永远不会被触发,完全应该如此。