记录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. 手机,IPAD查看eagle素材库

    把eagle素材库塞进手机里是一种什么样的体验?手机和ipad也能查看eagle素材库,随时随地查询浏览素材. 先看使用截图 实现原理: 在任意电脑,服务器或者nas中安装PicHome系统.在Pic ...

  2. 使用Go语言开发一个短链接服务:二、架构设计

    章节  使用Go语言开发一个短链接服务:一.基本原理  使用Go语言开发一个短链接服务:二.架构设计  使用Go语言开发一个短链接服务:三.项目目录结构设计  使用Go语言开发一个短链接服务:四.生成 ...

  3. PSS:你距离NMS-free+提点只有两个卷积层 | 2021论文

      论文提出了简单高效的PSS分支,仅需在原网络的基础上添加两个卷积层就能去掉NMS后处理,还能提升模型的准确率,而stop-grad的训练方法也挺有意思的,值得一看 来源:晓飞的算法工程笔记 公众号 ...

  4. Unicode编码解码的全面介绍

    1. Unicode的起源和发展 Unicode是一个国际标准,旨在统一世界上所有文字的表示方式.它最初由Unicode协会创立,解决了不同字符集之间的兼容性问题.Unicode的发展经历了多个版本, ...

  5. iNeuOS工业互联网操作系统,“低代码”表单开发应用过程(一)

    iNeuOS工业互联网操作系统,"低代码"表单开发应用过程(一) 目       录 1.      概述... 2 2.      "低代码"表单开发应用过程 ...

  6. 程序员必备上传服务器Xftp及连接服务器工具Xshell

    1.下面截图为破解工具,点击执行就可以用了 压缩包放云盘了,私信我即可 (不知道咋上传,有点尴尬Q.Q)

  7. #二叉堆#JZOJ 4320 旅行

    分析 有一个很重要的性质就是如果经过道路数为奇数,把两个点到根节点的路径长加起来就是两个点间的路径长(正负消掉了) 而且众所周知的是奇数+偶数=奇数 可以预处理每个点到根节点的路径长度(按照题目要求) ...

  8. vs报错:RC1004 unexpected end of file found

    如图,在编译代码时,出现报错:RC1004  unexpected end of file found 原因是,cpp最后要多一行才行,不然就会报这个错误 错误示例: int main() { ret ...

  9. ODBC批量merge中出现主键冲突的分析

    ODBC 批量 merge 中出现主键冲突的分析 一. 文档概括 客户某个 merge 语句运行时,发生主键冲突报错. 经分析,其原因如下: 由于 merge 语句中,ON 里的判断条件(谓词)中存在 ...

  10. 第十八篇:Django进级

    一.Django工程创建 二.Django 的 CBV和FBV 三.模板语言循环字典 四.Django基于正则表达式的URL 五.Django对应的路由名称 六.Django路由分发 七.Django ...