【问题标题】:MVC4 action method loggingMVC4 动作方法日志记录
【发布时间】:2013-07-02 04:35:04
【问题描述】:

我正在构建一个 MVC4 Web 应用程序。我的要求是使用 log4net 记录控制器操作方法的 http 请求的执行持续时间。

我听说这样做的首选方法是创建一个自定义操作过滤器 - 在 onExecuting 方法中启动秒表 - 然后在 onExecuted 中记录持续时间。

我有一个自定义模型绑定器对我的存储库进行查询以构造复杂的对象。因为模型绑定器在过滤器之前执行,所以我无法获得准确的持续时间读数。

我可以使用自定义 HTTPModule,但我如何知道它是否路由到操作方法...

编辑:

我的操作将客户域对象作为参数。我使用自定义模型绑定器在 url 中查找密钥并从我的存储库中获取客户对象。

有什么想法吗?

【问题讨论】:

  • 你的模型绑定器访问数据库是一个糟糕的设计,你开始明白为什么了。模型绑定器应该只绑定从客户端发送的数据。最好在 ActionFilter 中执行此操作,而不是在模型绑定器中执行此操作。

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

你的问题有点混乱。您想要跟踪操作/结果执行或模型绑定器执行。为什么你让模型绑定器联系你的存储库来构造一个对象?模型绑定器应将对象构造为您在 HttpPost 操作中指定的类型。至于操作/结果跟踪,这里有一个小参考,可以帮助您确定要跟踪的内容(如果您想使用操作过滤器进行跟踪)。

在 MVC 中,您可以跟踪操作何时开始执行以及何时完成,您还可以跟踪结果何时开始处理以及结果何时结束。

前两个选项通过接口IActionFilter 实现。此过滤器需要您实现两种方法:OnActionExecutingOnActionExecuted。第一个方法在动作开始之前调用,最后一个方法在动作结束之后调用。

第二个界面与正在生成的结果有关。这是通过IResultFilter 接口实现的。它还包含两个要实现的方法。它们是OnResultExecutingOnResultExecuted。第一个方法OnResultExecutingOnActionExecuted 完成后调用。这是您的结果点,假设ViewResult 已开始处理将返回给用户的输出。一旦视图准备就绪并返回给用户,OnResultExecuted 就会启动。这会通知您处理已完成。

现在,您要记录的内容由您决定。如果您需要在操作开始时记录,对底层数据源进行调用并结束,然后实现IActionFilter。如果您需要跟踪处理结果需要多长时间,请实施IResultFilter

您还可以通过从 ActionFilterAttribute 继承来同时实现这两个过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2023-03-05
    • 2021-11-19
    • 2016-06-30
    相关资源
    最近更新 更多