精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

巧用ActionFilterAttribute實現API日志的記錄

開發 前端
使用Func 委托實現API日志的記錄,這次我們使用另外一種方式,Filter來記錄輸入輸出日志。

[[381754]]

 本文轉載自微信公眾號「UP技術控」,作者conan5566。轉載本文請聯系UP技術控公眾號。  

背景

上回提到開發web api的時候,一般是需要記錄api的輸入輸出信息,方便后續排查問題;使用的是委托的形式進行記錄日志。

使用Func

這次我們使用另外一種方式,Filter來記錄輸入輸出日志。

實現方式

1、首先在進入action的時候,定義OnActionExecuting。

  1. public override void OnActionExecuting(ActionExecutingContext context) 
  2.         { 
  3.             base.OnActionExecuting(context); 
  4.  
  5.             // 后續添加了獲取請求的請求體,如果在實際項目中不需要刪除即可 
  6.             long contentLen = context.HttpContext.Request.ContentLength == null ? 0 : context.HttpContext.Request.ContentLength.Value; 
  7.             if (contentLen > 0) 
  8.             { 
  9.                 // 讀取請求體中所有內容 
  10.                 System.IO.Stream stream = context.HttpContext.Request.Body; 
  11.                 if (context.HttpContext.Request.Method == "POST"
  12.                 { 
  13.                     stream.Position = 0; 
  14.                 } 
  15.                 byte[] buffer = new byte[contentLen]; 
  16.                 stream.Read(buffer, 0, buffer.Length); 
  17.                 // 轉化為字符串 
  18.                 RequestBody = System.Text.Encoding.UTF8.GetString(buffer); 
  19.             } 
  20.  
  21.             ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(context.ActionArguments); 
  22.  
  23.             Stopwatch = new Stopwatch(); 
  24.             Stopwatch.Start(); 
  25.         } 

2、定義Stopwatch ,計算方法的耗時。

 

 

  1. private string ActionArguments { get; set; } 
  2.  
  3.         /// <summary> 
  4.         /// 請求體中的所有值 
  5.         /// </summary> 
  6.         private string RequestBody { get; set; } 
  7.  
  8.         private Stopwatch Stopwatch { get; set; } 

3、結束的時候,把信息打印出來OnActionExecuted。

  1. public override void OnActionExecuted(ActionExecutedContext context) 
  2.         { 
  3.             base.OnActionExecuted(context); 
  4.             Stopwatch.Stop(); 
  5.  
  6.             string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString; 
  7.             string method = context.HttpContext.Request.Method; 
  8.             string controller = context.Controller.ToString(); 
  9.             string action = context.ActionDescriptor.DisplayName; 
  10.             string token = ""
  11.             if (context.HttpContext.Request != null && context.HttpContext.Request.Headers != null && context.HttpContext.Request.Headers["Authorization"].Count > 0) 
  12.             { 
  13.                 token = context.HttpContext.Request.Headers["Authorization"]; 
  14.             } 
  15.             string qs = ActionArguments; 
  16.             dynamic result = context?.Result?.GetType()?.Name == "EmptyResult" ? new { Value = "無返回結果" } : context?.Result as dynamic
  17.  
  18.             string res = "在返回結果前發生了異常"
  19.             try 
  20.             { 
  21.                 if (result != null
  22.                 { 
  23.                     res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value); 
  24.                 } 
  25.             } 
  26.             catch (System.Exception) 
  27.             { 
  28.                 res = "日志未獲取到結果,返回的數據無法序列化"
  29.             } 
  30.  
  31.             NLogger.Info( 
  32.                 $"地址:{url} \n " + 
  33.                   $"controller:{controller} \n " + 
  34.                     $"action:{action} \n " + 
  35.                       $"token:{token} \n " + 
  36.                 $"方式:{method} \n " + 
  37.                 $"請求體:{RequestBody} \n " + 
  38.                 $"參數:{qs}\n " + 
  39.                 $"結果:{res}\n " + 
  40.                 $"耗時:{Stopwatch.Elapsed.TotalMilliseconds} 毫秒(指控制器內對應方法執行完畢的時間)"); 
  41.         } 

4、控制器調用LogAttribute。

  1. /// <summary> 
  2.     /// 
  3.     /// </summary> 
  4.     [Produces("application/json")] 
  5.     [LogAttribute] 
  6.     [CustomExceptionFilterAttribute] 
  7.     public class DefaultController : Controller 
  8.     { 
  9.     } 

 

 

完整代碼



  1. using CompanyName.ProjectName.Core; 
  2. using Microsoft.AspNetCore.Mvc.Filters; 
  3. using System.Diagnostics; 
  4.  
  5. namespace CompanyName.ProjectName.HttpApi.Host.Code 
  6.     /// <summary> 
  7.     /// 攔截器 
  8.     /// </summary> 
  9.     public class LogAttribute : ActionFilterAttribute 
  10.     { 
  11.         private string ActionArguments { get; set; } 
  12.  
  13.         /// <summary> 
  14.         /// 請求體中的所有值 
  15.         /// </summary> 
  16.         private string RequestBody { get; set; } 
  17.  
  18.         private Stopwatch Stopwatch { get; set; } 
  19.  
  20.         /// <summary> 
  21.         /// 
  22.         /// </summary> 
  23.         /// <param name="context"></param> 
  24.         public override void OnActionExecuting(ActionExecutingContext context) 
  25.         { 
  26.             base.OnActionExecuting(context); 
  27.  
  28.             // 后續添加了獲取請求的請求體,如果在實際項目中不需要刪除即可 
  29.             long contentLen = context.HttpContext.Request.ContentLength == null ? 0 : context.HttpContext.Request.ContentLength.Value; 
  30.             if (contentLen > 0) 
  31.             { 
  32.                 // 讀取請求體中所有內容 
  33.                 System.IO.Stream stream = context.HttpContext.Request.Body; 
  34.                 if (context.HttpContext.Request.Method == "POST"
  35.                 { 
  36.                     stream.Position = 0; 
  37.                 } 
  38.                 byte[] buffer = new byte[contentLen]; 
  39.                 stream.Read(buffer, 0, buffer.Length); 
  40.                 // 轉化為字符串 
  41.                 RequestBody = System.Text.Encoding.UTF8.GetString(buffer); 
  42.             } 
  43.  
  44.             ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(context.ActionArguments); 
  45.  
  46.             Stopwatch = new Stopwatch(); 
  47.             Stopwatch.Start(); 
  48.         } 
  49.  
  50.         /// <summary> 
  51.         /// 
  52.         /// </summary> 
  53.         /// <param name="context"></param> 
  54.         public override void OnActionExecuted(ActionExecutedContext context) 
  55.         { 
  56.             base.OnActionExecuted(context); 
  57.             Stopwatch.Stop(); 
  58.  
  59.             string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString; 
  60.             string method = context.HttpContext.Request.Method; 
  61.             string controller = context.Controller.ToString(); 
  62.             string action = context.ActionDescriptor.DisplayName; 
  63.             string token = ""
  64.             if (context.HttpContext.Request != null && context.HttpContext.Request.Headers != null && context.HttpContext.Request.Headers["Authorization"].Count > 0) 
  65.             { 
  66.                 token = context.HttpContext.Request.Headers["Authorization"]; 
  67.             } 
  68.             string qs = ActionArguments; 
  69.             dynamic result = context?.Result?.GetType()?.Name == "EmptyResult" ? new { Value = "無返回結果" } : context?.Result as dynamic
  70.  
  71.             string res = "在返回結果前發生了異常"
  72.             try 
  73.             { 
  74.                 if (result != null
  75.                 { 
  76.                     res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value); 
  77.                 } 
  78.             } 
  79.             catch (System.Exception) 
  80.             { 
  81.                 res = "日志未獲取到結果,返回的數據無法序列化"
  82.             } 
  83.  
  84.             NLogger.Info( 
  85.                 $"地址:{url} \n " + 
  86.                   $"controller:{controller} \n " + 
  87.                     $"action:{action} \n " + 
  88.                       $"token:{token} \n " + 
  89.                 $"方式:{method} \n " + 
  90.                 $"請求體:{RequestBody} \n " + 
  91.                 $"參數:{qs}\n " + 
  92.                 $"結果:{res}\n " + 
  93.                 $"耗時:{Stopwatch.Elapsed.TotalMilliseconds} 毫秒(指控制器內對應方法執行完畢的時間)"); 
  94.         } 
  95.     } 

 

責任編輯:武曉燕 來源: UP技術控
相關推薦

2021-02-03 05:24:44

API日志

2024-10-22 08:47:03

2021-02-01 00:04:13

Dictionary數據批量

2023-03-10 08:59:30

2010-09-25 16:17:25

SQL語句

2024-12-18 12:10:00

2021-11-17 09:00:00

Kubernetes集群容器

2024-08-26 08:27:18

2011-09-23 10:53:09

2025-04-01 08:20:00

Logging模塊Python日志記錄

2024-10-06 13:49:30

2025-10-14 07:59:41

2022-02-08 17:07:54

Spring BooSpring Aop日志記錄

2023-05-26 07:08:05

CSS模糊實現文字

2021-11-03 17:10:37

CSS sticky前端代碼

2024-09-09 15:24:26

Redis開發

2024-12-23 13:31:38

2010-11-18 13:40:48

mysql分頁查詢

2025-08-07 03:00:00

2011-08-04 13:31:50

數據庫記錄更改日志觸發器
點贊
收藏

51CTO技術棧公眾號

国产91精品一区| 欧美日韩中文不卡| 日韩精品福利| 乱码第一页成人| 亚洲欧美日韩高清| 国产aaa一级片| 色影院视频在线| 国产成人免费视| 欧美一区在线直播| 国产在线免费av| 136国产福利精品导航网址应用| 亚洲一区中文在线| 日本不卡高清视频一区| 国产精品嫩草影院桃色| 国产欧美91| 日韩一区二区欧美| 这里只有精品在线观看视频 | 91色.com| 成人在线中文字幕| 天天操天天操天天操天天| 色综合色综合| 精品视频www| 五月天六月丁香| 色猫猫成人app| 精品国产电影一区| 400部精品国偷自产在线观看| 欧洲成人一区二区三区| 久久电影国产免费久久电影| 91chinesevideo永久地址| 男女性高潮免费网站| 久久不见久久见免费视频7| 欧美一区二区精品在线| 欧美性大战久久久久xxx| 亚洲综合伊人久久大杳蕉| 国产日本欧洲亚洲| 精品国产91九色蝌蚪| 可以免费观看av毛片| 韩国日本一区| 亚洲精品国产一区二区精华液| 日本在线观看一区二区| 日本激情视频网站| 国产高清不卡一区二区| 国产欧美va欧美va香蕉在| 91精品国产综合久久久蜜臀九色| 亚洲一本视频| 久久成年人免费电影| 99国产精品无码| 波多野结衣在线观看一区二区三区| 日韩成人av网| 国产美女视频免费观看下载软件| 亚洲一二三区视频| 欧美一二三区在线观看| 午夜免费一级片| 99视频在线观看地址| 99国产精品99久久久久久| www.一区二区三区| 国产不卡精品视频| 国产伦精品一区二区三区免费| 国产精品入口日韩视频大尺度| 日本韩国欧美中文字幕| 亚洲综合不卡| 日本久久久久久久久久久| 久久精品国产成人av| 久久av一区| 国产成人精品视| 91在线视频免费播放| 丝袜a∨在线一区二区三区不卡| 26uuu亚洲国产精品| 在线观看黄网站| 久久精品一区| 国产精品白嫩初高中害羞小美女| www.亚洲激情| 精品写真视频在线观看| 亚洲影院色在线观看免费| 亚洲av无码国产精品永久一区| 福利电影一区二区| 国内精品二区| 国产在线观看黄| 国产精品久久久久一区二区三区| 日本成人性视频| 金瓶狂野欧美性猛交xxxx| 亚洲成人av资源| 欧美精品色婷婷五月综合| av在线一区不卡| 欧美一区二区日韩一区二区| 国产不卡一二三| 欧美日韩精品一区二区视频| xx视频.9999.com| 国产亚洲精品码| 香蕉久久夜色精品国产| 国产一区二区视频在线观看| 黄色美女一级片| 国产日韩欧美不卡| 免费看日b视频| 香蕉伊大人中文在线观看| 欧洲生活片亚洲生活在线观看| 亚洲妇熟xx妇色黄蜜桃| 久久草在线视频| 中文一区二区视频| 免费无码毛片一区二区app| 亚洲综合日本| 亚洲一区中文字幕在线观看| 可以在线观看的av| 亚洲女人****多毛耸耸8| 欧美 日韩 国产一区| 成人激情久久| 日韩精品在线免费| 91嫩草丨国产丨精品| 国产精品久久国产愉拍| 91美女片黄在线观看游戏| 五月婷在线视频| 1024亚洲合集| 热久久精品国产| 澳门久久精品| 日韩在线播放一区| 欧美男人亚洲天堂| 成人免费高清在线观看| 中文字幕一区二区三区精彩视频 | 亚洲素人一区二区| 久久网站免费视频| 成人av动漫| 久久天天躁狠狠躁夜夜av| 黄色av网站免费| av一区二区三区在线| 久久观看最新视频| 91tv亚洲精品香蕉国产一区| 日韩电视剧在线观看免费网站| 国产精品99久久久久久成人| 日韩和的一区二区| 久久精品美女| 51av在线| 精品久久人人做人人爽| 精品国产精品国产精品| 免费看欧美女人艹b| 久久青青草原| av成人影院在线| 精品国产91洋老外米糕| 久久精品视频免费在线观看| 久久国产福利国产秒拍| 天堂va久久久噜噜噜久久va| 日本乱码一区二区三区不卡| 亚洲成人网在线| 欧美日韩一级大片| 国产精品影视在线| 国产又黄又爽免费视频| 久久久精品一区二区毛片免费看| 亚洲午夜小视频| 亚洲GV成人无码久久精品| 99综合电影在线视频| 国产 欧美 日韩 一区| 日本成人手机在线| 欧美成人精品不卡视频在线观看| 国产精品自拍电影| 亚洲视频图片小说| 国产毛片久久久久久| 综合久久久久| 成人自拍视频网站| 国内在线免费视频| 亚洲精品在线观| 国产成人自拍视频在线| 99精品在线免费| 欧美 激情 在线| 精品国产一区二区三区小蝌蚪| 国产精品福利在线观看网址| 成人欧美亚洲| 在线播放日韩导航| 欧美精品99久久久| 成人性生交大片| 日韩av片在线看| 精品国产美女| 成人在线视频网| 日韩伦理电影网站| 亚洲精品国产suv| 中文字幕手机在线视频| 国产精品乱码久久久久久| 一区二区三区欧美精品| 欧美激情综合| 精品久久蜜桃| 欧美国产日韩电影| 久久人人爽人人爽爽久久| 国产富婆一级全黄大片| 五月婷婷激情综合网| 国产精品333| 西瓜成人精品人成网站| 国产精品久久久久久久久久久久久久| 在线观看黄av| 精品国产乱码久久久久久蜜臀 | 日本韩国一区二区三区| 欧美人与性动交α欧美精品| 国产精品vip| 久久久久一区二区| 欧美成人黄色| 国内精品伊人久久| 搞黄视频免费在线观看| 日韩欧美一区二区久久婷婷| 日本中文字幕免费| 国产精品网站在线播放| 中文字幕无人区二| 石原莉奈一区二区三区在线观看| 中国成人亚色综合网站| 久久精品国产亚洲5555| 国产精品一区二区久久久久| 欧美伦理免费在线| 在线看日韩av| 天天操天天射天天| 欧美日韩亚洲综合一区二区三区| www.av视频在线观看| 国产精品视频免费| 国产精品无码电影| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品秘入口18禁麻豆免会员| 国产精品毛片一区二区在线看| 国外成人在线视频网站| 亚洲一区导航| 国产成人精品一区二区| 牛牛精品在线| 久久精品中文字幕免费mv| 国产在线观看高清视频| 亚洲国产三级网| www.看毛片| 欧美精品久久天天躁| 成年人av网站| 欧美日韩国内自拍| 久久精品女人毛片国产| 日韩美女视频一区二区 | 国产v在线观看| 欧美亚洲动漫另类| 在线精品免费视| 欧美视频在线观看免费网址| 精品99久久久久成人网站免费 | 色老太综合网| 5566成人精品视频免费| 丰满诱人av在线播放| 久久在线观看视频| 日本中文字幕在线2020| 国产亚洲视频在线观看| 日本成人一区| 国产手机视频精品| 亚洲aaaaaaa| 日韩精品一区二区三区视频| 国产熟女一区二区三区四区| 欧美色图片你懂的| 精品国产青草久久久久96| 在线中文字幕一区二区| 波多野结衣黄色| 欧美怡红院视频| 中文在线字幕免费观| 在线国产电影不卡| 国产女优在线播放| 欧美日本一道本| 一级黄色小视频| 欧美丰满少妇xxxxx高潮对白| 一区二区视频播放| 欧美精品1区2区| 亚洲专区在线播放| 欧美一区中文字幕| www.久久久久久| 亚洲精品aⅴ中文字幕乱码| 天天操天天干天天| 亚洲人成欧美中文字幕| 国产黄在线观看免费观看不卡| 国产一区二区三区在线播放免费观看| 成人h小游戏| 久久久国产精品亚洲一区| 91蜜桃在线视频| 久久免费在线观看| 原纱央莉成人av片| 国产精品久久久久久中文字| 深夜福利亚洲| 成人9ⅰ免费影视网站| 欧美综合自拍| 亚洲国产一区在线| 亚洲精品极品少妇16p| 日韩一二区视频| 亚洲在线播放| 天天干在线影院| 国产尤物一区二区| 成人午夜精品无码区| 国产清纯白嫩初高生在线观看91 | 97在线中文字幕| 久久香蕉网站| 婷婷亚洲婷婷综合色香五月| 午夜av一区| 日韩人妻无码精品久久久不卡| 久久成人精品| 搡的我好爽在线观看免费视频| 成人免费va视频| 国产免费一区二区三区网站免费| 中文字幕人成不卡一区| 日本一区二区网站| 欧美日韩电影一区| 婷婷视频在线观看| 色偷偷偷综合中文字幕;dd| 日韩经典av| 国产精品视频久久久| 超碰成人免费| 亚洲一区二区三区四区中文| 欧美日韩ab| 五月婷婷丁香综合网| 成人av免费在线播放| 亚洲色图100p| 欧美日韩亚洲系列| 国产白浆在线观看| 一区二区三区精品99久久| 国产网红女主播精品视频| 国产精品日韩专区| 久久九九热re6这里有精品| 一本色道久久综合亚洲精品婷婷| 在线观看日韩av电影| 亚洲视频一二三四| 久久综合给合久久狠狠狠97色69| 老熟妇高潮一区二区三区| 色系网站成人免费| 高潮毛片7777777毛片| 色yeye香蕉凹凸一区二区av| 国产激情在线播放| 91成人免费观看| 欧美大片aaaa| 国产成人综合一区| 99国产麻豆精品| 麻豆成人在线视频| 欧美疯狂性受xxxxx喷水图片| 高清日韩av电影| 欧美性受xxx| 老牛影视av一区二区在线观看 | 在线综合亚洲| 少妇欧美激情一区二区三区| 国产精品高潮久久久久无| 一级片免费在线播放| 亚洲成色777777在线观看影院| 高h视频在线观看| 国产精品自产拍高潮在线观看| 欧美美女在线| 99精品人妻少妇一区二区 | 亚洲综合不卡| 中文字幕免费在线播放| 亚洲妇熟xx妇色黄| 亚洲国产成人精品一区二区三区| 久久成年人视频| 白嫩亚洲一区二区三区| 亚洲一区三区电影在线观看| 日本sm残虐另类| 在线观看免费小视频| 91精品1区2区| 国产女主播在线直播| 国产成人精品av在线| 国产精品午夜一区二区三区| 欧美韩国日本在线| 久久精品在线免费观看| 亚洲天堂男人av| 亚洲天堂色网站| 国产精品字幕| 色大师av一区二区三区| 青青草成人在线观看| 少妇视频在线播放| 欧美色综合影院| 男人的天堂在线视频免费观看| 国产色视频一区| 欧美激情日韩| 中国免费黄色片| 狠狠躁天天躁日日躁欧美| 人操人视频在线观看| 国产97在线亚洲| 久久国产精品亚洲人一区二区三区 | 日本在线免费看| 亚洲影院高清在线| 91久久在线| 99久久久无码国产精品性| 欧美亚洲国产bt| www在线观看播放免费视频日本| 91视频网页| 国产日韩欧美一区| 久久久视频6r| 91精品国产麻豆国产自产在线| 1stkiss在线漫画| 久久99精品久久久久久秒播放器| 久久性天堂网| 中文字幕在线2021| 亚洲黄色av女优在线观看| 欧美三级精品| 中国女人做爰视频| 久久众筹精品私拍模特| 91精品国产色综合久久不8| 欧美成人精品激情在线观看 | 自拍偷拍亚洲色图欧美| 成人黄色在线视频| 超碰在线免费97| 欧美大片免费看| 久久av免费看| 韩国三级hd中文字幕有哪些| 色综合久久综合网欧美综合网| 天堂а√在线官网| 国产伦精品一区二区三区视频孕妇 | 亚洲女同ⅹxx女同tv| 色吊丝在线永久观看最新版本| 国产日韩视频在线观看| 999亚洲国产精| 少妇高潮在线观看| 精品亚洲一区二区三区四区五区| 亚洲男女网站|