zoukankan      html  css  js  c++  java
  • 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>();
  • 相关阅读:
    debugs
    MySQL事务隔离级别详解(转)
    解决SQL Server管理器无法连接远程数据库的问题(转)
    jQuery中click(),bind(),live()的区别(转)
    各jQuery选择器的用法(转)
    使用JQuery获取对象的几种方式(转)
    HTML中元素的定位方式
    深入浅出REST(转载)
    jQuery-Selectors(选择器)的使用(二、层次篇)(转载)
    linux常用命令
  • 原文地址:https://www.cnblogs.com/xtxtx/p/12561043.html
Copyright © 2011-2022 走看看