1. 程式人生 > >【C#】WebApi 添加過濾器,實現對請求參數和響應內容的日誌記錄

【C#】WebApi 添加過濾器,實現對請求參數和響應內容的日誌記錄

total exc gpo start ID json clear block pub

filter的介紹

filter在Web API中經常會用到,主要用於記錄日誌,安全驗證,全局錯誤處理等;Web API提供兩種過濾器的基本類型:actionfilterattribute,exceptionfilterattribute;兩個類都是抽象類,actionfilter主要實現執行請求方法體之前(覆蓋基類方法OnActionExecuting),和之後的事件處理(覆蓋基類方法OnActionExecuted);exceptionfilter主要實現觸發異常方法(覆蓋基類方法OnException)。下面對前者類型做示例。

新建ActionFilter類

打印參數、返回值、以及接口響應時間:

技術分享圖片
 public class ActionFilter : ActionFilterAttribute
    {
        private const string Key = "action";
        private bool _IsDebugLog = true;
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (_IsDebugLog)
            {
                Stopwatch stopWatch = new Stopwatch();

                actionContext.Request.Properties[Key] = stopWatch;

                string actionName = actionContext.ActionDescriptor.ActionName;

                Debug.Print(Newtonsoft.Json.JsonConvert.SerializeObject(actionContext.ActionArguments));

                stopWatch.Start();
            }

        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (_IsDebugLog)
            {
                Stopwatch stopWatch = actionExecutedContext.Request.Properties[Key] as Stopwatch;

                if (stopWatch != null)
                {

                    stopWatch.Stop();

                    string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;

                    string controllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;

                    Debug.Print(actionExecutedContext.Response.Content.ReadAsStringAsync().Result);

                    Debug.Print(string.Format(@"[{0}/{1} 用時 {2}ms]", controllerName, actionName, stopWatch.Elapsed.TotalMilliseconds));
                }
            }
        }

    }
技術分享圖片

在接口的action方法上添加過濾器

[ActionFilter]

技術分享圖片

或者將過濾器添加到配置中,這樣將相當於在每個接口上添加了過濾器

技術分享圖片

演示

發送請求:

技術分享圖片

接口響應:

技術分享圖片

【C#】WebApi 添加過濾器,實現對請求參數和響應內容的日誌記錄