2013-06-24 88 views
0

我構建了一個MVC4 web應用程序。我的要求是使用log4net記錄控制器操作方法的http請求的執行持續時間。MVC4操作方法日誌記錄

我聽說首選的方法是創建一個自定義actionfilter - 在onExecuting方法中啓動秒錶 - 然後在onExecuted中記錄持續時間。

我有一個自定義模型聯編程序對我的存儲庫執行查詢以構建複雜對象。由於模型聯編程序在篩選器之前執行,因此我無法獲得準確的持續時間讀數。

我可以使用自定義的HttpModule,但我怎麼知道,如果其路由到操作方法或不...

編輯:

我的動作發生在用戶域對象作爲參數。我使用自定義模型綁定器來查找URL中的密鑰並從我的回購中獲取客戶對象。

任何想法?

+0

訪問數據庫的模型聯編程序是一個糟糕的設計,並且您開始明白爲什麼。模型聯編程序應該只綁定從客戶端發送的數據。你最好在ActionFilter而不是模型綁定器中做這件事。 –

回答

0

你的問題有點混亂。您想跟蹤動作/結果執行或模型聯編程序執行。爲什麼你有模型聯編程序聯繫你的存儲庫來構建一個對象?模型聯編程序應該將對象構造爲您在HttpPost操作中指定的類型。至於動作/結果跟蹤,這裏有一點參考可以幫助你找出你想跟蹤的內容(如果你想使用動作過濾器進行跟蹤)。

在MVC中,您可以跟蹤動作何時開始執行以及何時完成,還可以跟蹤結果何時開始處理以及結果何時結束。

前兩個選項通過接口IActionFilter實現。此過濾器要求您實施兩種方法:OnActionExecutingOnActionExecuted。第一個方法在動作開始之前被調用,最後一個方法在動作結束後被調用。

第二個界面是關於正在生成的結果。這是通過IResultFilter接口實現的。它還包含兩個要實施的方法。這些是OnResultExecutingOnResultExecuted。在完成OnActionExecuted之後調用第一個方法OnResultExecuting。這是你得到的結果,假設ViewResult已經開始處理將返回給用戶的輸出。一旦視圖準備好並返回給用戶,OnResultExecuted就會啓動。這會通知您處理已完成。

現在,你想記錄什麼是由你決定的。如果您在動作開始時需要登錄,請撥打底層數據源並結束,然後執行IActionFilter。如果您需要跟蹤結果處理需要多長時間,則執行IResultFilter

您也可以通過繼承ActionFilterAttribute來同時實現兩個過濾器。