4

ユーザー アクティビティの記録と障害検出のために、アクション フィルターを介して詳細をキャプチャするロガーを実装しています。

   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 メソッド内でこれを達成する別の方法はありますか?

4

1 に答える 1

4

リクエスト本文全体を単純にログに記録してみませんか? このようにして、ユーザー要求を再構築するために必要なものがすべて揃っています。

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ます。

于 2012-10-19T08:01:17.590 に答える