如何记录对 asp.net-core identity based application 的访问
How to log the visits on asp.net-core identity based application
我正在使用 Entity Framework 核心和 ASP.NET 核心身份,我想记录谁访问了 cars/details 页面。 log
table 只有三列(visitid
、username
、visittime
)。
I am using Entity Framework Core & ASP.NET Core Identity and I want to log who visited the cars/details page. log table only have three columns (visitid
, username
, visittime
).
我想你已经创建了一个包含三列(visitid
、username
、visittime
)的 LogModel
,并且你已经生成了相关的 table 在数据库中。如果日志table没有创建,可以参考下面代码创建模型,然后add migration and update database to generate the table.
public class LogModel
{
public int VisitId { get; set; }
public string VisitName { get; set; }
public DateTime VisitTime { get; set; }
}
然后,在controller details action方法中,可以新建一个LogModel
,当用户访问这个action方法时,会把新的LogModel
实例插入到数据库中。代码如下:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly MvcMovieContext context;
public HomeController(ILogger<HomeController> logger, MvcMovieContext movieContext)
{
_logger = logger;
context = movieContext;
}
public IActionResult Details()
{
//create a new log record.
var newlog = new LogModel()
{
VisitId = 101, //set the value, or set this column as auto increase (Identity).
VisitName = User.Identity.Name, //get the current user name through the User.
VisitTime = DateTime.Now
};
context.Logs.Add(newlog); //insert into the database
context.SaveChanges(); //save change.
return RedirectToAction("Index");
}
编辑:
使用Action Filter方法将当前用户信息记录到数据库中,可以先获取当前用户信息,然后在Action Filter中获取请求的action方法名,然后再向数据库中插入记录。
代码如下:
public class TestActionFilter:IActionFilter
{
private readonly ApplicationDbContext _dbcontext;
public TestActionFilter(ApplicationDbContext context)
{
_dbcontext = context;
}
public void OnActionExecuting(ActionExecutingContext context)
{
//get current user name
var currentuser = context.HttpContext.User.Identity.Name;
//get the request action method,
var actionname = context.HttpContext.Request.RouteValues["action"];
//based on the action method to insert record into database.
//use _dbcontext to insert data.
// Do something before the action executes.
Console.WriteLine("TestActionExecuting: " + context.HttpContext.Request.Path);
}
public void OnActionExecuted(ActionExecutedContext context)
{
// Do something after the action executes.
Console.WriteLine("TestActionExecuted: " + context.HttpContext.Request.Path);
}
}
然后,在Startup.cs文件
的ConfigureServices方法中注册动作过滤器
services.AddControllersWithViews(options=> {
options.Filters.Add(typeof(TestActionFilter));
});
更多关于ActionFilter的详细信息,参见:Filters in ASP.NET Core
我正在使用 Entity Framework 核心和 ASP.NET 核心身份,我想记录谁访问了 cars/details 页面。 log
table 只有三列(visitid
、username
、visittime
)。
I am using Entity Framework Core & ASP.NET Core Identity and I want to log who visited the cars/details page. log table only have three columns (
visitid
,username
,visittime
).
我想你已经创建了一个包含三列(visitid
、username
、visittime
)的 LogModel
,并且你已经生成了相关的 table 在数据库中。如果日志table没有创建,可以参考下面代码创建模型,然后add migration and update database to generate the table.
public class LogModel
{
public int VisitId { get; set; }
public string VisitName { get; set; }
public DateTime VisitTime { get; set; }
}
然后,在controller details action方法中,可以新建一个LogModel
,当用户访问这个action方法时,会把新的LogModel
实例插入到数据库中。代码如下:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly MvcMovieContext context;
public HomeController(ILogger<HomeController> logger, MvcMovieContext movieContext)
{
_logger = logger;
context = movieContext;
}
public IActionResult Details()
{
//create a new log record.
var newlog = new LogModel()
{
VisitId = 101, //set the value, or set this column as auto increase (Identity).
VisitName = User.Identity.Name, //get the current user name through the User.
VisitTime = DateTime.Now
};
context.Logs.Add(newlog); //insert into the database
context.SaveChanges(); //save change.
return RedirectToAction("Index");
}
编辑:
使用Action Filter方法将当前用户信息记录到数据库中,可以先获取当前用户信息,然后在Action Filter中获取请求的action方法名,然后再向数据库中插入记录。
代码如下:
public class TestActionFilter:IActionFilter
{
private readonly ApplicationDbContext _dbcontext;
public TestActionFilter(ApplicationDbContext context)
{
_dbcontext = context;
}
public void OnActionExecuting(ActionExecutingContext context)
{
//get current user name
var currentuser = context.HttpContext.User.Identity.Name;
//get the request action method,
var actionname = context.HttpContext.Request.RouteValues["action"];
//based on the action method to insert record into database.
//use _dbcontext to insert data.
// Do something before the action executes.
Console.WriteLine("TestActionExecuting: " + context.HttpContext.Request.Path);
}
public void OnActionExecuted(ActionExecutedContext context)
{
// Do something after the action executes.
Console.WriteLine("TestActionExecuted: " + context.HttpContext.Request.Path);
}
}
然后,在Startup.cs文件
的ConfigureServices方法中注册动作过滤器 services.AddControllersWithViews(options=> {
options.Filters.Add(typeof(TestActionFilter));
});
更多关于ActionFilter的详细信息,参见:Filters in ASP.NET Core