2013-02-11 115 views
3

我最近有不幸需要在ASP.NET MVC操作中找到錯誤的根本原因。錯誤原來是在動作中聲明的動作過濾器之一。然而,找到這個錯誤主要是純粹的運氣,而且花費的時間比合理。將來,如何調試ASP.NET MVC操作過濾器的問題?調試ASP.NET MVC動作過濾器

特別是:

  • 我如何可以找出哪些過濾器處理特定請求,並在其中順序執行?
  • 我可以通過這些過濾器嗎?
  • 我可以在每個過濾器之間至少獲得一些鉤子來幫助找到根本原因(例如通過追蹤某些狀態)嗎?
  • 當篩選器中止請求或導致異常時,是否可以掛鉤一些事件?

我試過使用VS.NET調試器;但它不會以有用的方式進入過濾器。如果我在請求之前暫停執行,服務器會根據需要等待調試器,但是當我使用Step into或step over時,它將繼續執行,而不會通過任何篩選器(只是我的代碼已關閉)。如果事先知道哪些過濾器已註冊,我可能會設置一個斷點,但這很難實際,尤其是因爲某些過濾器位於第三方代碼中。

+0

如果它是您自己的過濾器,您可以設置斷點來調試它們。您可以使用[Glimpse](http://getglimpse.com/)查看爲請求執行的過濾器。 – khellang 2013-02-11 10:52:50

+0

聽起來像一個答案,即使不是100%完美! – 2013-02-11 10:58:45

+0

這就是爲什麼我選擇評論:) – khellang 2013-02-11 11:06:00

回答

3

以下代碼將按照它們被調用的順序編寫控制器和操作的名稱。我希望它能幫助別人,因爲它對我很有幫助。

如果你有一個基礎控制器,並且其餘的控制器繼承它,那麼下面的代碼會讓你知道所有的控制器和任何請求所要求的動作。

#if DEBUG 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       string controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 
       string action = filterContext.ActionDescriptor.ActionName; 

       Debug.WriteLine("Controller-" + controller + ", Action-" + action); 
      } 
#endif 

P.S. - 如果您需要更多詳細信息,例如處理動作時間或一些可插拔系統,請使用Glimpse。它只需要幾分鐘就可以運行。這是一個偉大的工具。在附註中,瞥見提供的時間不準確,因爲還有一些Glimpse的開銷也包括在內。

+0

感謝您回答這個古老的問題 - 很高興看到煩惱解決:-)。 – 2014-05-20 13:35:34