记录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. redis安装启动脚本

    #!/bin/bash # sudo yum install -y gcc # sudo yum install -y ruby build-essential BASE=/usr/local ps ...

  2. oracle_fdw扩展使用中异常问题

    Oracle_fdw 的使用介绍已经在之前的文章中介绍过了,具体见:https://www.cnblogs.com/kingbase/p/14846479.html. 本篇文章介绍一下可能碰到的问题处 ...

  3. linux xfce 在文件管理器里点击运行shell脚本文件

    1.打开 Settings Editor 2.点击左边的 thunar 3.点击右边的 添加 ,在属性中输入 /misc-exec-shell-scripts-by-default 在类型中选择布尔类 ...

  4. 使用vcpkg和OHOS SDK构建开源软件

    安装OHOS SDK 参照OHOS IDE和SDK的安装方法,安装构建工具. 创建用户环境变量OHOS_NDK_HOME,指向OHOS SDK的安装路径,比如D:\Tools\Huawei\OHOS\ ...

  5. C#的无边框窗体改变大小解决方案 - 开源研究系列文章

    这次继续研究无边框窗体需要的功能.其实就是把有边框的默认窗体的一些功能进行实现而已.不过不同的人不一定相同的代码,所以笔者尽量用最简单有效的方法例子让读者能够直接对代码进行复用,以节省时间和人力.这次 ...

  6. OpenHarmony自定义构建函数:@Builder装饰器

      前面章节介绍了如何创建一个自定义组件.该自定义组件内部UI结构固定,仅与使用方进行数据传递.ArkUI还提供了一种更轻量的UI元素复用机制@Builder,@Builder所装饰的函数遵循buil ...

  7. Seaborn线性关系数据可视化

    regplot() 绘制两个变量的线性拟合图. sns.regplot( x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', scat ...

  8. 【Insights直播】华为帐号服务,打造全场景安全帐号体系

    在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...

  9. sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章]

    mysql select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28)) when mth then ADDDATE(y.first_mon ...

  10. spring boot yaml 配置[三]

    前言 我们知道java 因为历史的原因,一直有一个配置地狱的痛点.那么如何解决掉它呢? spring boot 是一柄利器,但是呢,还是要配置. 看来配置的避免不了的了. 那么如何可以减轻这种痛苦呢? ...