使用ISAPI过滤器跟踪和计时WCF调用?

时间:2009-05-22 05:05:32

标签: wcf iis trace isapi

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

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

提前致谢

2 个答案:

答案 0 :(得分:0)

WCF提供比ISAPI过滤器更好的扩展点。你可以,例如创建一个客户端消息检查器,在消息发送到服务器之前调用,然后在响应返回时调用,因此您可以从客户端角度轻松地测量服务调用所需的时间。 / p>

查看IClientMessageInspector界面 - 可能是您正在寻找的界面。另请参阅有关如何使用此界面的优秀blog entry

马克

答案 1 :(得分: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();
        }
    }