首页 > 解决方案 > 使用 ActionFilter 的 ASP.NET Core 日志记录

问题描述

我正在尝试添加一个日志记录功能以保存到我的 SQL 服务器数据库。我尝试创建 ActionFilter 类并应用于我的一个控制器但无法正常工作。我想捕获用户 ID、IP 地址、控制器和操作访问以及时间戳。我错过了什么?

AuditAttribute Action Filter class

public class AuditAttribute : ActionFilterAttribute
{
    private readonly ApplicationDbContext _db;

    //Inject ApplicationDBContext
    public AuditAttribute(ApplicationDbContext db)
    {
        _db = db;
    }

    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

         //Stores the Request in an Accessible object
         var request = filterContext.HttpContext.Request;

        //Generate an audit
        Portal_Logger audit = new Portal_Logger()
        {
            teacherNRIC = filterContext.HttpContext.User.Identity.Name,
            IPAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork)),
            ControllerAccess = (string)filterContext.RouteData.Values["controller"],
            Timestamp = DateTime.Now,
        };

         public DbSet<Portal_Logger> Portal_LoggerDBSet { get; set; }
        //Store objects to database
        _db.Portal_LoggerDBSet.Add(audit);
        _db.SaveChanges();

        base.OnActionExecuting(filterContext);
    }

}
}     


Home controller class
[AuditAttribute]
public class HomeController : Controller
{ ..content of controller
}


Portal_logger model class
public class Portal_Logger
{
    [Key]
    public int LoggerId { get; set; }

    [StringLength(10)]
    public string userid{ get; set; }

    [StringLength(50)]
    public string IPAddress { get; set; }

    [StringLength(50)]
    public string ControllerAccess { get; set; }

    public DateTime? Timestamp { get; set; }

}

请参阅附加图像 中的错误消息 错误消息的屏幕截图

我尝试了一个新问题。 在此处输入图像描述

我试过这个方法也不起作用。[AuditActionFilter] -> 错误信息(AuditActionFilter 不是属性类)

public class HomeController : Controller
{
}

我尝试了这种方法,但仍然无法正常工作。

[AuditActionFilter] - error message -> "AuditActionFilter" is not an 
public class HomeController : Controller
{
}

我已将 services.AddMVC 添加到 startup.cs
services.AddMvc(options => options.Filters.Add(typeof(AuditActionFilter)));

这是 AuditActionFilter.cs

public class AuditActionFilter : IActionFilter
{
    private readonly ApplicationDbContext _db;

    public AuditActionFilter(ApplicationDbContext db)
    {
        _db = db;
    }

    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var request = filterContext.HttpContext.Request;

        Portal_Logger audit = new Portal_Logger()
        {
            teacherNRIC = filterContext.HttpContext.User.Identity.Name,
            IPAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork)),
            ControllerAccess = (string)filterContext.RouteData.Values["controller"],
            Timestamp = DateTime.Now,
        };

        //Store objects to database
        _db.Portal_LoggerDBSet.Add(audit);
        _db.SaveChanges();
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // do something after the action executes or leave it empty
    }

}

标签: c#asp.net-coreloggingaction-filter

解决方案


对于AuditAttribute在特定方法或控制器上使用,您可以尝试ServiceFilterAttributeTypeFilterAttribute

以下是可用的两个选项:

选项1

使用TypeFilterAttribute.

[TypeFilter(typeof(AuditAttribute))]
public class HomeController : Controller

选项2

利用ServiceFilterAttribute

  1. 注册AuditAttribute_Startup.cs

     services.AddScoped<AuditAttribute>();
    
  2. 利用AuditAttribute

     [ServiceFilter(typeof(AuditAttribute))]
     public class HomeController : Controller
    

推荐阅读