IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> net core 请求日志[中间件方式] -> 正文阅读

[开发测试]net core 请求日志[中间件方式]

核心问题:? ?.net Core自定义中间件中读取Request.Body和Response.Body的内容

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
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;


/// <summary>
/// 扩展中间件
/// </summary>
public static class ErrorHandlingMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder app)
    {
        return app.UseMiddleware<ErrorHandlingMiddleware>();
    }
}

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private SortedDictionary<string, object> _data;
    private Stopwatch _stopwatch;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
        _stopwatch = new Stopwatch();
    }

    public async Task Invoke(HttpContext context)
    {
        _stopwatch.Restart();
        _data = new SortedDictionary<string, object>();

        //启用读取request
        context.Request.EnableBuffering();
        var request = context.Request;
        var response = context.Response;

        #region 存档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"));

        if (request.Method.ToLower().Equals("post"))
        {
            //请求body
            using var ms1 = new MemoryStream();
            await request.Body.CopyToAsync(ms1);
            var s1 = ms1.ToArray();
            var requestBody = Encoding.UTF8.GetString(s1); //把body赋值给bodyStr
            _data.Add("request.body", requestBody);
            request.Body.Position = 0;
        }
        else if (request.Method.ToLower().Equals("get"))
        {
            _data.Add("request.body", request.QueryString.Value);
        }
        var responseOriginalBody = response.Body;
        using var memStream = new MemoryStream();
        response.Body = memStream; 
        #endregion

        // 执行其他中间件
        await _next(context);

        #region 存档response
        //处理执行其他中间件后的ResponseBody
        memStream.Position = 0;
        var responseReader = new StreamReader(memStream);
        var responseBody = await responseReader.ReadToEndAsync();
        memStream.Position = 0;
        await memStream.CopyToAsync(responseOriginalBody);
        _data.Add("response.body", responseBody);
        _data.Add("response.executeEndTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

        #endregion


        // 响应完成记录时间和存入日志
        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;
        });

    }
}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:49:55  更:2022-05-05 11:51:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 15:35:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码