net core http请求响应中间件 及全局异常中间件小计
using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using NLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WebApplication8 { public class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; private readonly Logger _logger; public RequestResponseLoggingMiddleware(RequestDelegate next) { _next = next; _logger = LogManager.GetCurrentClassLogger(); } public async Task Invoke(HttpContext context) { string userName = "", requestInfo = "", responseInfo = ""; var originalBodyStream = context.Response.Body; var stopwach = Stopwatch.StartNew(); try { requestInfo = await FormatRequest(context.Request); //context.Items["requestInfo"] = requestInfo; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; await _next(context); stopwach.Stop(); responseInfo = await FormatResponse(context.Response); //context.Items["responseInfo"] = responseInfo; await responseBody.CopyToAsync(originalBodyStream); } userName = Convert.ToString(context.Items["userName"]); var logMsg = $@"{userName} 请求信息: {requestInfo}{Environment.NewLine}响应信息: {responseInfo}{Environment.NewLine}耗时: {stopwach.ElapsedMilliseconds}ms"; _logger.Log(LogLevel.Info, logMsg); } catch (Exception ex) { stopwach.Stop(); if (ex != null) { var logMsg = $@"{userName} 请求信息: {requestInfo}{Environment.NewLine}异常: {ex.ToString()}{Environment.NewLine}耗时: {stopwach.ElapsedMilliseconds}ms"; _logger.Log(LogLevel.Error, logMsg); _logger.Log(LogLevel.Error, ex.ToString()); var errResult = new ReturnValue(ResultCode.系统发生错误, ex.Message); var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(errResult)); await originalBodyStream.WriteAsync(bytes, 0, bytes.Length); } } } private async Task<string> FormatRequest(HttpRequest request) { HttpRequestRewindExtensions.EnableBuffering(request); var body = request.Body; var buffer = new byte[Convert.ToInt32(request.ContentLength)]; await request.Body.ReadAsync(buffer, 0, buffer.Length); var bodyAsText = Encoding.UTF8.GetString(buffer); body.Seek(0, SeekOrigin.Begin); request.Body = body; return $" {request.Method} {request.Scheme}://{request.Host}{request.Path} {request.QueryString} {bodyAsText}"; } private async Task<string> FormatResponse(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); var text = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return $"{response.StatusCode}: {text}"; } } }
放在startup的Configure方法所有中间件最上面
app.UseMiddleware<RequestResponseLoggingMiddleware>();