• EF语句拦截器-匹配当前的Controller,Action,User


    示例代码,ps:一切都能实现,关键是你尝试的方向,别把简单问题复杂化导致进入死胡同出不来。

    using Mobile360.Core.Interfaces;
    using Mobile360.Core.Models;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity.Infrastructure.Interception;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace Mobile360.Data
    {
        /// <summary>
        /// 数据库执行拦截
        /// </summary>
        public class EFIntercepterLogging : DbCommandInterceptor
        {
           
            private readonly Stopwatch _stopwatch = new Stopwatch();
            private IRepository repo;
            public EFIntercepterLogging()
            {
                this.repo = DependencyResolver.Current.GetService<IRepository>();
            }
    
            public override void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            {
                base.ScalarExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            { 
                _stopwatch.Stop();
                AuditLog aLog = InitLog();
                
                if (interceptionContext.Exception != null)
                {
                    aLog.SqlQuery = (string.Format("Exception:{1} 
     --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString()));
                }
                else
                {
                    aLog.SqlQuery = (string.Format("
    执行时间:{0} 毫秒
    -->ScalarExecuted.Command:{1}
    ", _stopwatch.ElapsedMilliseconds, command.CommandText));
                }
    
                repo.Insert<AuditLog>(aLog);
                repo.SaveChangesAsync();
    
                base.ScalarExecuted(command, interceptionContext);
            }
            public override void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                base.NonQueryExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                _stopwatch.Stop();
                AuditLog aLog = InitLog();
    
                if (interceptionContext.Exception != null)
                {
                    aLog.SqlQuery = (string.Format("Exception:{1} 
     --> Error executing command:
     {0}", command.CommandText, interceptionContext.Exception.ToString()));
                }
                else
                {
                    aLog.SqlQuery = (string.Format("
    执行时间:{0} 毫秒
    -->NonQueryExecuted.Command:
    {1}", _stopwatch.ElapsedMilliseconds, command.CommandText));
                }
                repo.Insert<AuditLog>(aLog);
                repo.SaveChangesAsync();
    
                base.NonQueryExecuted(command, interceptionContext);
            }
            public override void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
            {
                base.ReaderExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
            {
                _stopwatch.Stop();
                AuditLog aLog = InitLog();
    
                if (interceptionContext.Exception != null)
                {
                    aLog.SqlQuery = (string.Format("Exception:{1} 
     --> Error executing command:
     {0}", command.CommandText, interceptionContext.Exception.ToString()));
                }
                else
                {
                    aLog.SqlQuery = (string.Format("
    执行时间:{0} 毫秒 
     -->ReaderExecuted.Command:
    {1}", _stopwatch.ElapsedMilliseconds, command.CommandText));
                }
                repo.Insert<AuditLog>(aLog);
                repo.SaveChangesAsync();
    
                base.ReaderExecuted(command, interceptionContext);
            }
    
            private AuditLog InitLog()
            {
                AuditLog log = new AuditLog();
    
                HttpContextBase context = new HttpContextWrapper(HttpContext.Current);
                RouteData rd = RouteTable.Routes.GetRouteData(context);
                if (rd != null)
                {
                    string controllerName = rd.GetRequiredString("controller");
                    string actionName = rd.GetRequiredString("action");
                    string userName = HttpContext.Current.User.Identity.Name;
    
                    log.Controller = controllerName;
                    log.Action = actionName;
                    log.StartTime = DateTime.Now;
                    log.EndTime = DateTime.Now;
                    log.AuditAccount = userName;
    
                }
                return log;
            }
        }
    }
  • 相关阅读:
    Linux使用Public Key方式远程登录
    Linux编译安装Mariadb数据库
    Centos7环境搭建lnmp环境
    浅谈Java中的System.gc()的工作原理
    Eclipse快捷键大全(转载)
    java中的参数传递——值传递、引用传递
    Visual Studio 2017 安装后无法创建c++或MFC项目
    ubuntu sendmail配置发送邮件
    ubuntu11.0静态IP地址配置
    cin与cout详解
  • 原文地址:https://www.cnblogs.com/x-poior/p/7081549.html
Copyright © 2020-2023  润新知