簡體   English   中英

使用 ActionFilter 的 ASP.NET Core 日志記錄

[英]ASP.NET Core Logging With ActionFilter

我正在嘗試添加一個日志記錄功能以保存到我的 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
    }

}

要在特定方法或控制器上使用AuditAttribute ,您可以嘗試ServiceFilterAttributeTypeFilterAttribute

以下是可用的兩個選項:

選項1

使用TypeFilterAttribute

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

選項2

使用ServiceFilterAttribute

  1. Startup.cs注冊AuditAttribute

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

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

發生錯誤是因為您的屬性上有一個“DbContext”參數,但在將其應用於控制器時沒有提供它?

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

此處描述了如何使用 DI in Action 過濾器: https : //www.c-sharpcorner.com/blogs/custom-filter-in-mvc-or-logging-using-mvc-filter

文章簡述:

為所有控制器啟用:

starup.cs:

services.AddMvc(options =>  
{  
   options.Filters.Add(typeof(AuditAttribute));  
});

僅對一個控制器啟用:

starup.cs:

services.AddScoped<AuditAttribute>();

接下來放置在控制器或操作方法上:

[ServiceFilter(typeof(AuditAttribute))] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM