我正在构建一个MVC4 Web应用程序。我的要求是使用log4net记录http请求的控制器操作方法的执行持续时间。
我听说这样做的首选方法是创建一个自定义动作过滤器 - 在onExecuting方法中启动秒表 - 然后在onExecuted中记录持续时间。
我有一个自定义模型绑定器对我的存储库执行查询以构造复杂对象。因为模型绑定器在过滤器之前执行,所以我没有精确的持续时间读数。
我可以使用自定义HTTPModule,但我怎么知道它是否路由到action方法......
编辑:
我的操作将Customer域对象作为参数。我使用自定义模型绑定器在URL中找到密钥并从我的仓库中获取客户对象。
有什么想法吗?
答案 0 :(得分:0)
你的问题有点令人困惑。您希望跟踪操作/结果执行或模型绑定程序执行。为什么模型绑定器会联系您的存储库来构建对象?模型绑定器应该将对象构造为您在HttpPost
操作中指定的类型。至于动作/结果跟踪,这里有一个小参考,可以帮助您找出想要跟踪的内容(如果您想使用动作过滤器进行跟踪)。
在MVC中,您可以跟踪动作何时开始执行以及何时结束,您还可以跟踪结果何时开始处理以及结果何时结束。
前两个选项通过接口IActionFilter
实现。此过滤器要求您实施两种方法:OnActionExecuting
和OnActionExecuted
。第一个方法在操作开始之前调用,最后一个方法在操作结束后立即调用。
第二个接口与生成的结果有关。这是通过IResultFilter
接口实现的。它还包含两种要实现的方法。这些是OnResultExecuting
和OnResultExecuted
。在OnResultExecuting
完成后调用第一个方法OnActionExecuted
。这就是你得出的结果,假设ViewResult
已经开始处理将返回给用户的输出。一旦视图准备好并返回给用户,OnResultExecuted
就会启动。这会通知您处理已完成。
现在,您要记录的内容取决于您。如果您需要在操作开始时记录,请调用基础数据源并结束,然后实现IActionFilter
。如果您需要跟踪结果处理所需的时间,请实施IResultFilter
。
您还可以通过继承ActionFilterAttribute
。