【问题标题】:ActionAttributeFilter vs. Delegatinghandler - advantages/disadvantages?ActionAttributeFilter 与 Delegatinghandler - 优点/缺点?
【发布时间】:2014-05-23 09:24:36
【问题描述】:

我想记录来自请求的传入 json 数据和传出 json 作为响应。

经过一番搜索,我注意到自定义的 ActionAttributeFilter 和 DelegatingHandler 都可以使用。 它们有什么优点/缺点吗?

【问题讨论】:

    标签: asp.net-web-api2


    【解决方案1】:

    优点/缺点取决于您的需要。

    委托处理程序在 Web API 请求处理的层次结构中比 ActionAttributeFilter 高得多。如果您实现 Delegating Handler,您将创建一个消息处理程序,而如果您创建 Action 过滤器,您将创建在管道中的操作方法之前运行的过滤器。

    虽然消息处理程序在管道中运行得更早,但它在处理 尽早提出请求。消息处理程序为所有操作方法运行,或者至少为路由的所有操作方法运行。在选择消息处理程序来解决问题时应该考虑这一点。动作过滤器可以应用于单个动作方法、控制器中的所有方法或跨所有控制器的所有方法 将过滤器配置为全局过滤器。

    【讨论】:

    • 感谢您的回复。我只需要记录所有控制器中所有 get/post 方法的请求和响应中的 json 数据,仅此而已。听起来动作过滤器是这种情况下的最佳解决方案。我真的需要为它配置一些全局的东西还是用那个过滤器来注释方法就足够了?
    • FilterConfig.RegisterGlobalFilters 用于注册全局过滤器。如果您不这样做,则必须注释您希望此过滤器在其上运行的每个操作和/或每个功能。
    • 我认为对于您的特定情况,执行委派处理程序可能更有意义(但这取决于您要记录的内容)。请注意,委托处理程序在任何身份验证过滤器之前运行 - 因此,如果您也想记录身份验证/授权失败的请求,您应该将其设为委托处理程序。如果不是,它应该是一个动作过滤器(在身份验证/授权之后发生)。
    【解决方案2】:

    对于您的特定要求,即记录请求和响应,您应该使用委托处理程序。

    这样做的好处是您可以同时从请求和响应构建日志对象。这是因为委托处理程序围绕请求和响应运行,因此可以访问两者。

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
      var log = new Log { Url = request.RequestUri };     
      var response = await base.SendAsync(request, cancellationToken);
      log.ContentLength = response.ContentLength;
      this.LogAsync(log);
      return response;
    }
    

    使用 ActionFilter,您可以拥有将在请求之前和之后执行但不能始终执行的方法,因此您需要考虑以某种方式关联日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 2023-04-04
      • 2011-11-03
      • 2015-08-22
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多