1

我正在使用 WCF 构建一个 Web 应用程序,该应用程序将被其他应用程序作为服务使用。我们的应用程序将安装在 Web 服务场上,并出于可扩展性目的进行负载平衡。有时我们会遇到特定于一台 Web 服务器的问题,我们希望能够从响应中确定请求由哪个 Web 服务器处理,以及可能的时间信息。例如,此请求由 WebServer01 处理,请求需要 200 毫秒才能完成。

想到的第一个解决方案是构建一个 ISAPI 过滤器来添加一个 HTTP 标头,该标头将这些信息存储在响应中。这让我觉得以前一定有人做过这种事情。有没有更好的方法来做到这一点,或者我可以使用现成的 ISAPI 过滤器?

提前致谢

4

2 回答 2

0

WCF 提供了比 ISAPI 过滤器更好的扩展点。例如,您可以创建一个客户端消息检查器,该检查器在消息发送到服务器之前被调用,然后在响应返回时也被调用,因此您可以相当容易地测量来自客户端的服务调用所需的时间看法。

查看IClientMessageInspector界面 - 这可能是您正在寻找的。另请参阅有关如何使用此界面的出色博客条目。

马克

于 2009-05-22T05:18:16.060 回答
0

我没有现成的解决方案给你,但我可以将你指向IHttpModule。例如,请参阅Instrument and Monitor Your ASP.NET Apps Using WMI and MOM 2005中的代码。

    private DateTime startTime;

    private void context_BeginRequest(object sender, EventArgs e)
    {
        startTime = DateTime.Now;
    }

    private void context_EndRequest(object sender, EventArgs e)
    {
        // Increment corresponding counter
        string ipAddress = HttpContext.Current.Request.
            ServerVariables["REMOTE_ADDR"];
        if (HttpContext.Current.Request.IsAuthenticated)
            authenticatedUsers.Add(ipAddress);
        else
            anonymousUsers.Add(ipAddress);
        // Fire excessively long request event if necessary
        int duration = (int) DateTime.Now.Subtract(
            startTime).TotalMilliseconds;
        if (duration > excessivelyLongRequestThreshold)
        {
            string requestPath=HttpContext.Current.Request.Path;
            new AspNetExcessivelyLongRequestEvent(applicationName,
                duration,requestPath).Fire();
        }
    }
于 2009-05-22T05:22:28.850 回答