【问题标题】:ServiceStack - OnEndRequest capturing Response bodyServiceStack - OnEndRequest 捕获响应正文
【发布时间】:2015-04-14 06:33:02
【问题描述】:

我有一个与应用程序逻辑完全分离的 RequestLog 功能。

我在预请求过滤器中捕获请求/响应。为了实现这一点,我实例化了一个保留请求上下文的请求范围对象。在一切都被处理之前(在 AppHost 的 OnEndRequest 处理程序中),我写信给数据库。每个 http 请求一行。

我能够访问响应代码、路径、方法、请求正文、请求标头等。

但是响应流不可用,因为它已经被释放。这背后的逻辑是什么?是不是有点像,IIS 将流内容写入线路,并立即释放资源?有什么方法可以在 OnEndRequest 处理程序中捕获响应正文?

谢谢

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    不,ServiceStack 不会缓冲它直接写入 ASP.NET 响应的响应流。

    如果是request reaches that far,您可以添加全局响应过滤器或Custom ServiceRunner 来捕获服务响应,但可以通过关闭响应随时在整个请求管道中使请求短路。

    【讨论】:

    • 是的,我知道。事实上,这就是我在预请求过滤器中抓取所有内容并将它们转储到“OnEndRequest”的数据库的原因。我想要一个发布请求过滤器的错觉。这个想法是有一个请求记录器,其中包含进入 sshttphandlerfactory 的所有请求。由于“短路”,标准 RequestLogsFeature 无法实现此行为。没有考虑到这种情况有什么特别的原因吗?
    • 考虑过??短路是一项功能,响应始终按预期直接写入响应流。查看请求管道中的第一个条目以获取每个请求的通知,即注册一个 RawHttpHandler,您希望返回 null,这样您就不会劫持请求。
    • 我只是想了解您对此类记录器/功能的重要性的看法。也许你有理由认为它不相关,因为它在 ServiceStack 中没有被强烈考虑(RequestLogFeature 是一个 servicerunner 的东西)。但我想答案是使用 HttpRawHandler。我假设我仍然无法访问原始输出主体,这正是我的意图。这样,它将与写入响应并关闭请求的任何其他功能分离。
    【解决方案2】:

    我在 ServiceRequestLogger 中捕获响应时遇到了同样的问题。阅读这篇文章 - 它已在 4.0.39+(当前预发布)中解决

    ServiceStack response filter "short circuiting" causing problems

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多