我需要能够记录从我的asp.net mvc应用程序调用的所有操作。如何以及实现这一目标的最佳方法是什么?在哪里我记录它是否是控制台或日志文件并不重要。
您可以创建自己的类继承自ActionFilterAttribute,然后覆盖OnActionExecuting方法。
例
public class LogActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RequestContext.RouteData.Values["Controller"];
var action = filterContext.RequestContext.RouteData.Values["Action"];
//
// Perform logging here
//
base.OnActionExecuting(filterContext);
}
}
public class HomeController : Controller
{
[LogAction]
public ActionResult Index()
{
return View();
}
}
希望这可以帮助!
感谢HeyMega的回答。这是我在MVC5中实现的扩展实现的示例。
public class LogActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RequestContext.RouteData.Values.ContainsKey("Controller") ? filterContext.RequestContext.RouteData.Values["Controller"].ToString() : null;
var action = filterContext.RequestContext.RouteData.Values.ContainsKey("Action") ? filterContext.RequestContext.RouteData.Values["Action"].ToString() : null;
var area = filterContext.RequestContext.RouteData.DataTokens.ContainsKey("Area") ? filterContext.RequestContext.RouteData.DataTokens["Area"].ToString() : null;
var user = filterContext.RequestContext.HttpContext.User.Identity.GetUserId();
Task.Run(() => Generic().AreaActionLog(user, area, controller, action));
base.OnActionExecuting(filterContext);
}
}
我选择将执行实际日志记录的方法分离到单独的进程中,如果数据库交互出现任何问题,或者数据库交互需要几秒钟,则UI不会中断。
然后,您可以使用[LogAction]
属性来装饰整个控制器。
[LogAction]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
或者通过装饰单个方法有选择地应用属性:
public class HomeController : Controller
{
[LogAction]
public ActionResult Index_Logs_Things()
{
return View();
}
}
希望这有助于某人。