【问题标题】:Can I intercept after a response has been sent to a client in an IHttpModule我可以在 IHttpModule 中向客户端发送响应后拦截吗
【发布时间】:2013-05-24 05:19:12
【问题描述】:

我有一个自定义 IHttpModule 用于记录所有 HTTP 请求和响应,目前运行良好,但我很想扩展它,以便确定响应实际需要多长时间。

响应记录在 HttpApplication.EndRequest 事件中,但此事件在请求实际发送到 Web 客户端之前触发。虽然这使我可以确定服务器处理响应所需的时间,但我也希望能够计算客户端实际接收响应所需的时间。

是否有事件或其他机制允许我在客户端完成接收响应后进行拦截?

【问题讨论】:

  • 简而言之……不。服务器无法看到客户端何时收到数据,您必须使用 javascript 回调服务器。它们是这方面的许多示例框架,包括开源的和商业的。尝试集成 Glimpse
  • 对于我最感兴趣的日志记录应用程序,我无法控制客户端,这些客户端通过 HTTP 进行 SOAP 调用。所以听起来你的方法不适合我的需要。还是谢谢。
  • 最好你能算出最后一个字节离开服务器的时间,但这与 IIS 日志基本相同,可能需要 ISAPI 过滤器
  • 是的,这对我想要实现的目标并没有太大帮助,但无论如何再次感谢您的投入。我想我希望将响应流式传输到客户端的调用是同步的,并且我能够跨越它的任何一侧,这样我就可以计算实际的响应时间,而不是服务器处理的时间回应。
  • 当客户端收到所有字节后,服务器就开始了。因为服务器必须缓冲它。

标签: asp.net .net-4.0 asp.net-4.0 ihttpmodule


【解决方案1】:

所以这需要客户端代码。但并不完全清楚你想要测量什么。从最小到最大,时间可能是

  1. 服务器应用程序内的时间 - 由您已有的代码测量。
    • 您的代码可以在开始时从“Now()”或使用 HTTP 对象设置 start。对网站的第一次调用会发现这些开始时间之间存在很大差异,否则它们应该几乎相同。
  2. 服务器网站上的时间 - 我相信大多数托管服务(如 IIS)已经衡量了这一点。
  3. 服务器机器-我相信这就是“mo”所指的。您必须在服务器机器上进行某种外部监控,比如 WireShark。
  4. 客户端机器 - 同样,您必须在客户端机器上进行某种外部监控。这将是最难获得的,但我认为这确实是您所要求的。
  5. 客户端应用程序 - 这是您可以使用 javascript 测量的内容。

除非这是“第一次通话”(请参阅​​ Slow first page load on asp.net siteASP.NET application on IIS7 - very slow startup after iisreset),我相信所有这些时间都将如此接近,以至于您可以使用“足够好”的方法。

如果您必须衡量此调用的客户端时间,那么您就陷入了困境。但是,如果您只是想要更好的数字,只需继续使用您已有的数据来衡量 1.(应用程序时间),并确保同时衡量请求和响应的大小。

然后通过在各种目标客户端机器上进行测试来设置调整该时间的基线。

  • 测量从客户端到服务器的 ping 时间
  • 测量中等​​大小内容的传输时间 - 上传和下载
  • 找出数字以获得平均调整

你应该得到如下公式:

[AdjustedTime] = [PingTime] + [ServerTime]
+ ([UploadSpeed] * [RequestSize])
+ ([DownloadSpeed] * [ResponseSize]);

这将是预期的客户端响应时间。

【讨论】:

  • 你错过了我所要求的重点。我需要一种方法来确定客户端实际收到并完成处理响应之前需要多长时间。为了做到这一点,我需要在客户端完成接收响应后直接挂钩。
  • (更正,是的,我误解了这个问题)
  • 感谢您的详细回复。不幸的是,我正在寻找一个不涉及客户端参与的解决方案,因为我想分析一个 SOAP 服务和由我无法控制的第三方客户端调用的 ASP.NET 网站。由于 ASP.NET 框架似乎没有办法做到这一点,我的“解决方案”是完全忽略这个指标。
【解决方案2】:

是的,你可以处理HttpApplication.EndRequest

【讨论】:

  • 不,这是在 HTTP 管道链中触发的最后一个事件,但它仍然会在内容实际发送到客户端之前触发。
  • 带有无缓冲响应,它应该表明客户端已收到所有字节。因为它们直接通过线路发送(如果我错了,请纠正我)。我读了msdn.microsoft.com/en-us/magazine/cc188942.aspx,它表明它对于缓冲响应(默认)的工作方式略有不同
【解决方案3】:

另一种方法可能是将(例如:将响应时间写入数据库的 Windows 服务)连接到您的网络服务器 (IIS) 并跟踪这些事件。如果您想分析时间,客户端需要获取您的内容。

但我认为,iis 已经能够做到这一点。

这取决于你想要做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2021-03-22
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多