记录http请求

环境

  • .net7

一、过滤器(Filter)

这个过程用的的是操作过滤器(ActionFilter

二、

2.1 继承IAsyncActionFilter

2.2 重写OnActionExecutionAsync

OnActionExecutionAsync - 在调用操作方法前调用

OnActionExecutionAsync(ActionExecutingContext, ActionExecutionDelegate)

ActionExecutingContext 实例化新 ActionExecutingContext 实例,返回关于调用操作方法的信息

ActionExecutionDelegate

  • 异步返回的 ActionExecutedContext 委托,指示已执行操作或下一个操作筛选器
  • 完成后 Task 返回 的 ActionExecutedContext。

三、示例

public class AuditLogActionFilter : IAsyncActionFilter
{
//AuditLog服务对象,用于保存/查询等操作
//private readonly IAuditLogService _auditLogService;
//当前登录用户对象,获取当前用户信息 // 这些都是Abp中的,使用会报错。还没去看具体实现
//private readonly IAbpSession _admSession;
//系统日志接口,用于记录一些系统异常信息
//private readonly ILogger<AuditActionFilter> _logger;
//客户端信息接口,获取浏览器,IP等信息
//private readonly IClientInfoProvider _clientInfoProvider; public MysqlDbContext _dbContext; public AuditLogActionFilter(MysqlDbContext dbContext)
{
_dbContext = dbContext;
} // 方法进去前执行
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//接口Type
var type = (context.ActionDescriptor as ControllerActionDescriptor).ControllerTypeInfo.AsType();
//方法信息
var method = (context.ActionDescriptor as ControllerActionDescriptor).MethodInfo;
//方法参数
var arguments = context.ActionArguments;
//开始计时
var stopwatch = Stopwatch.StartNew(); var Request = context.HttpContext.Request;
var Response = context.HttpContext.Response; var auditInfoLog = new AuditInfoLog
{
Url = Request.Host.Value + Request.Path.Value, // 请求的URL
Host = Request.Host.Host.ToString(), // 请求地址
Port = Request.Host.Port, // 请求端口
Headers = Request.Headers.ToString(), // 请求头
Method = Request.Method, // 请求方法
ExcuteStartTime = DateTime.Now, // 执行开始时间
ServiceName = type != null ? type.FullName : "",
Parameters = JsonConvert.SerializeObject(arguments), // 请求参数
StatusCode = Response.StatusCode // 返回状态码
}; ActionExecutedContext result = null;
try
{
result = await next();
if (result.Exception != null && !result.ExceptionHandled)
{
auditInfoLog.Exception = result.Exception.ToString(); // 异常信息
}
}
catch (Exception ex)
{
auditInfoLog.Exception = ex.ToString(); // 异常信息
throw;
}
finally
{
stopwatch.Stop();
auditInfoLog.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); if (result != null)
{
switch (result.Result)
{
case ObjectResult objectResult:
auditInfoLog.ReturnValue = objectResult.Value.ToString();
break; case JsonResult jsonResult:
auditInfoLog.ReturnValue = jsonResult.Value.ToString();
break; case ContentResult contentResult:
auditInfoLog.ReturnValue = contentResult.Content;
break;
}
}
Console.WriteLine(auditInfoLog.ToString());
auditInfoLog.ReturnValue = auditInfoLog.ReturnValue; // 请求返回值 //保存审计日志 #region 存储到数据库
auditInfoLog.ExcuteEndTime = auditInfoLog.ExcuteStartTime.Add(stopwatch.Elapsed);
await _dbContext.AuditInfoLog.AddAsync(auditInfoLog);
_dbContext.SaveChanges();
#endregion #region 存储到本地
var date = DateTime.Now.ToString("yyyy-MM-dd");
var HttpLogPage = ($"LocalLogs/HttpLogs"); // 判断是否有这个文件夹,没有则生成
if (!Directory.Exists(HttpLogPage))
{
Directory.CreateDirectory(HttpLogPage);
}
using (StreamWriter sw = new StreamWriter($"{HttpLogPage}/HttpLog{date}.txt",true))
{
sw.WriteLine($"接口服务名称: {auditInfoLog.ServiceName}");
sw.WriteLine($"请求URL: {auditInfoLog.Url}");
sw.WriteLine($"请求地址: {auditInfoLog.Host}");
sw.WriteLine($"请求端口: {auditInfoLog.Port}");
sw.WriteLine($"请求方法: {auditInfoLog.Method}");
sw.WriteLine($"请求参数: {auditInfoLog.Parameters}");
sw.WriteLine($"返回状态码: {auditInfoLog.StatusCode}");
sw.WriteLine($"返回数据: {auditInfoLog.ReturnValue}");
sw.WriteLine($"执行开始时间: {auditInfoLog.ExcuteStartTime.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
sw.WriteLine($"执行时间: {auditInfoLog.ExecutionDuration}ms");
sw.WriteLine($"执行结束时间: {auditInfoLog.ExcuteEndTime.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
sw.WriteLine($"异常信息: {auditInfoLog.Exception}");
sw.WriteLine("======================================================");
sw.WriteLine();
}
#endregion //await _auditLogService.SaveAsync(auditInfo);
}
}
}

.net 记录http请求的更多相关文章

  1. tomcat访问(access)日志配置、记录Post请求参数

    tomcat访问(access)日志配置.记录Post请求参数 一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve classN ...

  2. ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.csd ...

  3. 在nginx日志access log可以记录POST请求的参数值

    1)      在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...

  4. Spring在Filter中记录Web请求Request和返回Response的内容及时长

    1 简介 在Spring MVC中,我们有时需要记录一下请求和返回的内容,方便出现问题时排查.比较Header.Request Body等.这些在Controller也可以记录,但在Filter中会更 ...

  5. 用Fundebug插件记录网络请求异常

    在服务端,不管我们使用Node.js.Java.PHP还是Python等等,都会用日志以文本的形式记录请求以及报错信息.这个对于后端做事后分析是很有用的. 另一方面,前端有时候出问题其实是因为后端接口 ...

  6. Servlet、Tomcat访问(access)日志配置、记录Post请求参数

    一.运行环境: Maven:3.5.2(点击下载) ,下载页 Tomcat:8.5.29(点击下载) ,下载页 JDK:jdk1.7.0_80(点击下载) ,下载页 MavenDependency: ...

  7. django 中间件记录所有请求及请求执行时间

    class LoggingMiddleware(object): def process_request(self, request): request.start_time = time.time( ...

  8. tomcat访问(access)日志配置、记录Post请求参数(转)

    一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve className="org.apache.catalina.va ...

  9. Spring中操作日志记录web请求的body报文

    在spring中,通常可以使用切面编程方式对web请求记录操作日志.但是这种方式存在一个问题,那就是只能记录url中的请求参数,无法记录POST或者PUT请求的报文体,因为报文体是放在request对 ...

  10. Nginx记录用户请求Header到access log

    为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番 ...

随机推荐

  1. RepPoints:微软巧用变形卷积生成点集进行目标检测,创意满满 | ICCV 2019

    RepPoints的设计思想十分巧妙,使用富含语义信息的点集来表示目标,并且巧用可变形卷积来进行实现,整体网络设计十分完备,值得学习   来源:晓飞的算法工程笔记 公众号 论文: RepPoints: ...

  2. Gaussian YOLOv3 : 对bbox预测值进行高斯建模输出不确定性,效果拔群 | ICCV 2019

    在自动驾驶中,检测模型的速度和准确率都很重要,出于这个原因,论文提出Gaussian YOLOv3.该算法在保持实时性的情况下,通过高斯建模.损失函数重建来学习bbox预测值的不确定性,从而提高准确率 ...

  3. KingbaseES V8R3集群运维案例之---备库状态‘down’修复

    ​ 案例说明: Kingbase V8R3集群,集群启动正常,备库数据库服务正常,流复制状态正常.但是备库在show pool_nodes下查看是'down'状态,通过pcp_attach_node重 ...

  4. 从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写

    Misc 学习(四) - 隐写分析:GIF 图片隐写 在上一期,我主要讲了讲自己对于隐写分析中的 PNG 图片隐写的一些浅薄理解,这一期我们继续对隐写分析的学习,学习的是图片隐写中的 GIF 图片隐写 ...

  5. 7 HTML锚点应用

    7 锚点应用 锚点( anchor )是超链接的一种应用,也叫命名锚记,锚点可以像一个定位器一样,可以实现页面内的链接跳转,运用相当普遍.例如,我们有一个网页,由于内容太多,导致页面很长,而且里面的内 ...

  6. kube-apiserver限流机制原理

    本文分享自华为云社区<kube-apiserver限流机制原理>,作者:可以交个朋友. 背景 apiserver是kubernetes中最重要的组件,一旦遇到恶意刷接口或请求量超过承载范围 ...

  7. 在Mac系统上使用Qt调用摄像头不出图解决方法

    需求:在Mac系统上,调用摄像头,实现旋转.缩放.处理视频帧等功能 问题:使用获取视频帧的方法,在Mac上调不起来摄像头 解决方法: 将视频窗口(QVideoWidget)和视频帧(QVideoFra ...

  8. 【01】微服务(Microservice)是什么?为什么会出现微服务?

    微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念. 实际上,很多 SOA(面向服务的架构)实施成熟度比较好的企业,已经在使用和实施微服务了.只 ...

  9. leetcode:94. 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? ...

  10. OceanBase初体验之从MySQL迁移数据到OceanBase集群

    前置条件 MySQL 环境 OceanBase 环境 测试用的表结构和一些数据 先在源端 MySQL 用如下脚本创建测试表,以及写入10000条数据用于迁移测试. use test; CREATE T ...