2012-10-17 23 views
2

我正在實現一個記錄器,該記錄器應該通過一個操作過濾器來捕獲細節,以便進行用戶活動記錄和故障查找。如何在操作篩選器中記錄所有查詢參數?

public interface ISessionLogger 
    { 
     void LogUserActionSummary(int sessionId, string userActionType);  
     void LogUserActionDetail(int session, string userActionType, DateTime userActionStartedUtc, long actionDurationInMilliseconds, string queryParams, string referredFrom); 
    } 

我想queryParams捕捉從形式收集,路由值,操作參數,可以JSON調用和查詢字符串,這聽起來所有鍵和值一樣,我需要

filterContext.Controller.ValueProvider

,但似乎沒有可能循環這一點。所以在我的FilterAttribute我有

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var paramList = new List<string>(); 
    if(filterContext.ActionParameters != null) 
    { 
     paramList.AddRange(filterContext.ActionParameters.Select(param => String.Format("{0}:{1}", param.Key, param.Value.ToString()))); 
    } 
    if(filterContext.Controller.ValueProvider != null) 
    { 
     //loop through the valueprovider and save the key value pairs to paramList 
    } 

    _queryParams = string.Join(",", paramList); 
} 

是否有另一種方式來行動濾波器的OnActionExecuting方法中實現這一目標?

+0

你檢查MSDN有關ValueProvider更多的細節? - http://msdn.microsoft.com/en-us/library/system.web.mvc.ivalueprovider(v=vs.108).aspx – KyorCode

+0

是的,它不是可枚舉的。 – friedX

回答

2

你爲什麼不只需登錄整個請求主體?這樣你將擁有一切你需要重建用戶請求。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var stream = filterContext.HttpContext.Request.InputStream; 
    var data = new byte[stream.Length]; 
    stream.Read(data, 0, data.Length); 
    Log(Encoding.UTF8.GetString(data)); 
} 

正如你可以嘗試記錄所有filterContext.HttpContext.Request.Params值以及filterContext.RouteData值替代:

+0

'filterContext.HttpContext.Request.Params'會給我服務器變量以及我不想記錄。 'Request.InputStream'不會捕獲通過一個屬性注入一個用戶名,到目前爲止我有'filterContext.HttpContext.Request.QueryString','filterContext.HttpContext.Request.Form'和'filterContext.ActionParameters'的組合。 – friedX

相關問題