.net 记录http请求
记录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请求的更多相关文章
- tomcat访问(access)日志配置、记录Post请求参数
tomcat访问(access)日志配置.记录Post请求参数 一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve classN ...
- ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客
原文:ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.csd ...
- 在nginx日志access log可以记录POST请求的参数值
1) 在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...
- Spring在Filter中记录Web请求Request和返回Response的内容及时长
1 简介 在Spring MVC中,我们有时需要记录一下请求和返回的内容,方便出现问题时排查.比较Header.Request Body等.这些在Controller也可以记录,但在Filter中会更 ...
- 用Fundebug插件记录网络请求异常
在服务端,不管我们使用Node.js.Java.PHP还是Python等等,都会用日志以文本的形式记录请求以及报错信息.这个对于后端做事后分析是很有用的. 另一方面,前端有时候出问题其实是因为后端接口 ...
- Servlet、Tomcat访问(access)日志配置、记录Post请求参数
一.运行环境: Maven:3.5.2(点击下载) ,下载页 Tomcat:8.5.29(点击下载) ,下载页 JDK:jdk1.7.0_80(点击下载) ,下载页 MavenDependency: ...
- django 中间件记录所有请求及请求执行时间
class LoggingMiddleware(object): def process_request(self, request): request.start_time = time.time( ...
- tomcat访问(access)日志配置、记录Post请求参数(转)
一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve className="org.apache.catalina.va ...
- Spring中操作日志记录web请求的body报文
在spring中,通常可以使用切面编程方式对web请求记录操作日志.但是这种方式存在一个问题,那就是只能记录url中的请求参数,无法记录POST或者PUT请求的报文体,因为报文体是放在request对 ...
- Nginx记录用户请求Header到access log
为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番 ...
随机推荐
- LOTO示波器_从零开始手把手测电源开环增益/电源环路频响曲线/PSM
我们之前有篇文章从理论到实践演示了如何测量电源环路的开环增益曲线,不过偏重于理论和原理,没有很多细节的展现,所以这片文章从另外的角度,从零基础开始,手把手一步一步演示如果进行实操测试. 之前的那篇文章 ...
- KingbaseES 扩展插件src_restrict 介绍
插件简介 src_restrict是KingbaseES的一个扩展插件,主要用于支持来源限制功能,该功能通过黑白名单来实现.插件src_restrict默认已经加载. 查看插件是否加载 show sh ...
- #背包#洛谷 4026 [SHOI2008]循环的债务
题目 分析 设\(dp[t][n][m]\)表示前\(t\)种钞票\(\text{Alice,Bob}\)分别拥有\(n,m\)元所需最小交换钞票数, 枚举\(\text{Alice,Bob}\)最后 ...
- #期望dp#洛谷 6835 [Cnoi2020]线形生物
题目 分析 设\(f[i]\)表示由点\(i\)走到点\(i+1\)的期望步数, \(dp[i]\)表示由点1走到点\(i+1\)的期望步数, 那么\(dp\)为\(f\)的前缀和,最后答案为\(dp ...
- OpenAtom OpenHarmony三方库创建发布及安全隐私检测
OpenAtom OpenHarmony三方库(以下简称"三方库"或"包"),是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开 ...
- Aspose.Cells使用总结大全
引用:https://blog.csdn.net/u011555996/article/details/79000270 使用到 Aspose.Cells 插件,整理一下. 一:新建解决方案,目录如下 ...
- C++调用Python-2:调用Python函数,返回数字
# mytest.py def hello(): print("this is test python print hello world") return 123 #includ ...
- 实例讲解昇腾 CANN YOLOV8 和 YOLOV9 适配
本文分享自华为云社区<昇腾 CANN YOLOV8 和 YOLOV9 适配>,作者:jackwangcumt. 1 概述 华为昇腾 CANN YOLOV8 推理示例 C++样例 , 是基于 ...
- linux 性能自我学习 ———— cpu 快速定位问题 [六]
前言 主要介绍一下cpu如何快速定位问题. 正文 cpu 的一些性能指标: 1. cpu 使用率 cpu 使用率描述了非空闲时间占总cpu时间的百分比,根据cpu上运行任务的不同,又被分为用户cpu. ...
- android 关于插件包内的依赖版本不一致问题得解决
前言 今天使用一个插件包的时候,依赖包冲突了,在此记录一下. 正文 在引用一个: debugImplementation 'com.squareup.leakcanary:leakcanary-and ...