[英]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
,您可以嘗試ServiceFilterAttribute
或TypeFilterAttribute
。
以下是可用的兩個選項:
選項1
使用TypeFilterAttribute
。
[TypeFilter(typeof(AuditAttribute))]
public class HomeController : Controller
選項2
使用ServiceFilterAttribute
在Startup.cs
注冊AuditAttribute
services.AddScoped<AuditAttribute>();
使用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.