使用ActionFilter的ASP.NET Core日志记录

时间:2018-08-22 10:08:08

标签: logging asp.net-core action-filter

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

const registeredUsers= [ {
  ID: 1, 
  CellPhone: "09123333333"
}, {
  ID: 2, 
  CellPhone: "09121111111"
}];

phoneContacts= [ {
  firstName: "aaaa", 
  lasttName: "aaaa", 
  phoneNumbers: [{id: "1", label: "mobile", number: "09121111111"},{id: "1", label: "home", number: "02188888888"}]
}, {
  firstName: "bbbb", 
  lasttName: "bbbb", 
  phoneNumbers: [{id: "1", label: "mobile", number: "09122222222"},{id: "1", label: "home", number: "02177777777"}],
}]

const contactsMergerdWithID = phoneContacts.map(contact => {
  const mobile = contact.phoneNumbers.find(phoneNumber => phoneNumber.label === 'mobile')
  const userfound = registeredUsers.find(user => user.CellPhone === mobile.number);
  return userfound ? { ...contact, ID: userfound.ID } : contact;
  // incase you dont want `phoneContacts` without `ID`, you can just return `false` instead of `contact` and put `.filter(Boolean)` after the `.map()`
});

console.log(contactsMergerdWithID);

请参阅附有图片的错误消息 Screenshot of error message

我尝试过并遇到一个新问题。 enter image description here

我也尝试过这种方法。     [AuditActionFilter]->错误消息(AuditActionFilter不是属性类)

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; }

}

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

public class HomeController : Controller
{
}

我已经添加了服务。将MVC添加到startup.cs
[AuditActionFilter] - error message -> "AuditActionFilter" is not an public class HomeController : Controller { }

这是AuditActionFilter.cs

services.AddMvc(options => options.Filters.Add(typeof(AuditActionFilter)));

2 个答案:

答案 0 :(得分:0)

要在特定方法或控制器上使用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
    

答案 1 :(得分:0)

发生错误是因为属性上有一个参数“ DbContext”,但是将其应用于控制器时没有提供它吗?

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