c# - 使用 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
}
}
解决方案
对于AuditAttribute
在特定方法或控制器上使用,您可以尝试ServiceFilterAttribute
或TypeFilterAttribute
。
以下是可用的两个选项:
选项1
使用TypeFilterAttribute
.
[TypeFilter(typeof(AuditAttribute))]
public class HomeController : Controller
选项2
利用ServiceFilterAttribute
注册
AuditAttribute
_Startup.cs
services.AddScoped<AuditAttribute>();
利用
AuditAttribute
[ServiceFilter(typeof(AuditAttribute))] public class HomeController : Controller
推荐阅读
- c# - 使用表达式函数返回值
- xamarin - 如何在 Xamarin Forms 中使用嵌入资源字体文件中的图标
- javascript - Javascript / CSS 砌体 - 尊重列
- mysql - 如何将查询集限制为 MySQL 中的 ID 子集?
- apache-storm - Apache Storm 2.1.0 内存相关配置
- django - Django MaterializeCSS - 工作,但不确定设置 css 和 js 的正确方法?
- r - 在堆积条形图中自定义不同大小的标签(ggplot2)
- angular - 向动态表单添加验证
- select - 检索具有给定值集且没有其他值的行
- django - 获取超过 1 个模型的序列化数据