2013-01-11 61 views
0

有人可以爲我澄清這種情況:MVC管道如何工作?

  1. 我們要求例如Home \ Index;
  2. 在全球ASAX我們Application_AuthorizeRequest
  3. Application_AuthorizeRequest拋出異常
  4. 我們的Application_Error它捕捉到它並返回新的View

    一個IController控制器=新ErrorController(); // routedata ok controller.Execute(new RequestContext(new HttpContextWrapper(Context),routeData));

  5. 與錯誤操作是執行(這是確定的)

  6. 但隨後MVC或ASP管道,依然試圖執行首頁\指數,我怎樣才能使管道忘了要求?

據我瞭解MVC它是HttpHandler,我怎樣才能確保我的錯誤行動是所有這些鏈中的最後一步?

回答

1

此設置存在問題。如果你想防止被調用,你應該寫一個自定義的授權指數action屬性,而不是使用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"); 
    } 
} 

授權過濾器更換Authenticate_Request方法在ASP.NET MVC應用程序,這就是你應該是什麼使用。

,然後裝飾與此屬性的索引操作:

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

現在你的Application_Error將被調用,執行錯誤控制和索引行動從來沒有被觸發,正是因爲它應該是。