Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ActionFilter的ASP.NET核心日志记录_C#_Asp.net Core_Logging_Action Filter - Fatal编程技术网

C# 使用ActionFilter的ASP.NET核心日志记录

C# 使用ActionFilter的ASP.NET核心日志记录,c#,asp.net-core,logging,action-filter,C#,Asp.net Core,Logging,Action Filter,我正在尝试添加一个日志功能以保存到我的SQL server数据库中。我试图创建ActionFilter类并应用到我的一个控制器上,但没有工作。 我想捕获用户ID、IP地址、控制器和操作访问以及时间戳。我错过了什么 AuditAttribute Action Filter class public class AuditAttribute : ActionFilterAttribute { private readonly ApplicationDbContext _db; /

我正在尝试添加一个日志功能以保存到我的SQL server数据库中。我试图创建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] - error message -> "AuditActionFilter" is not an 
public class HomeController : Controller
{
}
我已将services.AddMVC添加到startup.cs services.addmvcopions=>options.Filters.AddtypeofAuditActionFilter

这是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

选择2

使用ServiceFilterAttribute

在Startup.cs中注册AuditAttribute


发生错误的原因是您的属性上有一个DbContext参数,但将其应用于控制器时未提供该参数

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

什么不起作用?您有任何错误吗?我可以了解选项1和选项2的更多详细信息吗?@xingtan检查此文档Tks Tao Zhou。我来看看。你知道如何设置动作过滤器属性吗?
[TypeFilter(typeof(AuditAttribute))]
public class HomeController : Controller
 services.AddScoped<AuditAttribute>();
 [ServiceFilter(typeof(AuditAttribute))]
 public class HomeController : Controller
public AuditAttribute(ApplicationDbContext db)
{
    _db = db;
}