首页 > 其他分享 >.net 记录http请求

.net 记录http请求

时间:2023-08-23 10:44:33浏览次数:55  
标签:http 请求 sw ToString WriteLine var net auditInfoLog

记录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);
        }
    }
}

标签:http,请求,sw,ToString,WriteLine,var,net,auditInfoLog
From: https://www.cnblogs.com/zbfoot/p/17650579.html

相关文章

  • dockerfile netcore 示例
    #syntax=docker/dockerfile:1FROMmcr.microsoft.com/dotnet/sdk:7.0asbuild-envWORKDIR/appCOPY..RUNdotnetrestoreRUNdotnetpublish-cRelease-o/publishFROMmcr.microsoft.com/dotnet/aspnet:7.0asruntimeWORKDIR/srcCOPY--from=build......
  • 实现Fetch 请求扩展超时功能
    要实现基本的超时功能其实很简单,只需要使用AbortController这个API,如果你不熟悉它,可以点击链接了解一下/***@description:创建一个fetch函数*@param{*}timeout:传入超时的时间*@return{*}返回一个新的fetch函数*/functioncreateFetch(timeout){//......
  • 基于Alexnet深度学习网络的人脸识别算法matlab仿真
    1.算法理论概述一、引言       人脸识别是计算机视觉领域中的一项重要任务,它可以对人类面部特征进行自动识别和验证。近年来,随着深度学习的兴起,基于深度学习的人脸识别算法也得到了广泛的应用。本文将介绍基于Alexnet深度学习网络的人脸识别算法,包括详细的实现步骤和数......
  • SignalR实战:在.NET Framework和.NET Core中如何使用SignalR?
    官网文档:ASP.NETCoreSignalR入门|MicrosoftLearnSignalR开源代码:SignalR·GitHub很多小伙伴问:在前后端分离项目中,后端是.NETCore前端是Vue如何使用SignalR?在前后端不分离项目中,.NETFrameworkMVC项目中又如何使用SignalR技术呢?那就来看看下面这篇文章吧!本文主要介绍Signa......
  • 学习笔记:DSTAGNN: Dynamic Spatial-Temporal Aware Graph Neural Network for Traffic
    DSTAGNN:DynamicSpatial-TemporalAwareGraphNeuralNetworkforTrafficFlowForecastingICML2022论文地址:https://proceedings.mlr.press/v162/lan22a.html代码地址:https://github.com/SYLan2019/DSTAGNN一个用于时空序列预测的交通流量预测模型。可学习的地方:提出......
  • 统计数据源(NLP/AI/ML): Indeed.com(全球超过60个市场28种语言的招聘站:可视化统计数
    Indeed.com:全球招聘站可视化统计数据:(全球超过60个市场28种语言的招聘站:可视化统计数据https://www.hiringlab.org/data/)Indeedhaswebsitesinover60marketsand28languages.Thefulllistofmarketsishere:https://www.indeed.com/worldwide.Wehaveeconom......
  • 使用.NET Core进行微服务架构设计
    当谈到构建现代化、可扩展的应用程序架构时,微服务架构已经成为一个备受关注的话题。在这篇博客中,我们将探讨如何使用.NETCore来设计和实现微服务架构,并提供一些示例代码来帮助你入门。什么是微服务架构?微服务架构是一种软件架构模式,其中应用程序被拆分为一组小型、自治的服务,每个......
  • 了解ASP.NET Core中的中间件概念
    当谈到构建强大且高度可定制的Web应用程序时,ASP.NETCore是一个备受推崇的选择。其灵活性和可扩展性使开发人员能够以更有创意的方式构建应用程序,其中的中间件概念是实现这种灵活性的关键。什么是中间件?中间件是ASP.NETCore应用程序处理HTTP请求和响应的组件。它们在请求到达应用......
  • Kubernetes、Docker Swarm和Rancher的特点 - 容器编排平台比较
    本文将介绍三种流行的容器编排平台:Kubernetes、DockerSwarm和Rancher。我们将比较它们的特点,包括架构、功能、性能和生态系统。通过了解这些平台的优势和劣势,读者可以更好地选择适合自己需求的容器编排平台。引言随着容器技术的快速发展,容器编排平台的需求也日益增长。容器编排......
  • 闪现、请求扩展、g对象
    目录一闪现闪现示例分类放二请求扩展before_requestafter_requestbefore_first_requestteardown_requesterrorhandlertemplate_global全局标签template_filter全局过滤器三g对象四蓝图4.1使用蓝图4.2蓝图小型项目4.3蓝图大型项目五flask-session一闪现要求#一个请......