net core http请求响应中间件 及全局异常中间件小计

时间:2020-03-24
本文章向大家介绍net core http请求响应中间件 及全局异常中间件小计,主要包括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>();

原文地址:https://www.cnblogs.com/xtxtx/p/12561043.html