.net core webapi通過(guò)中間件獲取請(qǐng)求和響應(yīng)內(nèi)容的方法
本文主要根據(jù)中間件來(lái)實(shí)現(xiàn)對(duì).net core webapi
中產(chǎn)生的請(qǐng)求和響應(yīng)數(shù)據(jù)進(jìn)行獲取并存入日志文件中;
這里不詳細(xì)介紹日志文件的使用。你可以自己接入NLog,log4net,Exceptionless等
創(chuàng)建接口記錄的中間件
using Microliu.Core.Loggers; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Internal; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ptibro.Partner.API.Extensions { public class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; private SortedDictionary<string, object> _data; private Stopwatch _stopwatch; public RequestResponseLoggingMiddleware(RequestDelegate next, ILogger logger) { _next = next; _logger = logger; _stopwatch = new Stopwatch(); } public async Task Invoke(HttpContext context) { _stopwatch.Restart(); _data = new SortedDictionary<string, object>(); HttpRequest request = context.Request; _data.Add("request.url", request.Path.ToString()); _data.Add("request.headers", request.Headers.ToDictionary(x => x.Key, v => string.Join(";", v.Value.ToList()))); _data.Add("request.method", request.Method); _data.Add("request.executeStartTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 獲取請(qǐng)求body內(nèi)容 if (request.Method.ToLower().Equals("post")) { // 啟用倒帶功能,就可以讓 Request.Body 可以再次讀取 request.EnableRewind(); Stream stream = request.Body; byte[] buffer = new byte[request.ContentLength.Value]; stream.Read(buffer, 0, buffer.Length); _data.Add("request.body", Encoding.UTF8.GetString(buffer)); request.Body.Position = 0; } else if (request.Method.ToLower().Equals("get")) { _data.Add("request.body", request.QueryString.Value); } // 獲取Response.Body內(nèi)容 var originalBodyStream = context.Response.Body; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; await _next(context); _data.Add("response.body", await GetResponse(context.Response)); _data.Add("response.executeEndTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); await responseBody.CopyToAsync(originalBodyStream); } // 響應(yīng)完成記錄時(shí)間和存入日志 context.Response.OnCompleted(() => { _stopwatch.Stop(); _data.Add("elaspedTime", _stopwatch.ElapsedMilliseconds + "ms"); var json = JsonConvert.SerializeObject(_data); _logger.Debug(json, "api", request.Method.ToUpper()); return Task.CompletedTask; }); } /// <summary> /// 獲取響應(yīng)內(nèi)容 /// </summary> /// <param name="response"></param> /// <returns></returns> public async Task<string> GetResponse(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); var text = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return text; } } /// <summary> /// 擴(kuò)展中間件 /// </summary> public static class RequestResponseLoggingMiddlewareExtensions { public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder app) { return app.UseMiddleware<RequestResponseLoggingMiddleware>(); } } }
在startup.cs中Configure方法中使用中間件
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseErrorHandling();// 全局異常盡量放上面 ... app.UseRequestResponseLogging(); ... app.UseExceptionless(Configuration); app.UseMvc(); }
現(xiàn)在請(qǐng)求一次看一下記錄的效果:我的日志存在exceptionless上,如下圖
解析json,記錄的數(shù)據(jù)如下:
總結(jié)
以上所述是小編給大家介紹的.net core webapi通過(guò)中間件獲取請(qǐng)求和響應(yīng)內(nèi)容的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:ASP.NET Core中使用MialKit實(shí)現(xiàn)郵件發(fā)送功能
欄 目:ASP.NET
下一篇:NET Core 3.0 AutoFac內(nèi)置DI替換的新姿勢(shì)分享
本文標(biāo)題:.net core webapi通過(guò)中間件獲取請(qǐng)求和響應(yīng)內(nèi)容的方法
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10867.html
您可能感興趣的文章
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過(guò)程的方式


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置