2009-05-22 66 views
1

我正在构建一个使用WCF的Web应用程序,该应用程序将被其他应用程序作为服务使用。我们的应用程序将安装在Web服务场中,并且为了可扩展性的目的而进行负载平衡。偶尔我们会遇到特定于一个Web服务器的问题,并且我们希望能够根据响应来确定哪个Web服务器请求已被处理,并且可能还有时间信息。例如,这个请求由WebServer01处理,请求花了200ms完成。使用ISAPI筛选器跟踪和计时WCF呼叫?

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

在此先感谢

+0

道歉,我没有提到上面说我没有控制将调用服务的各种客户端应用程序。通常,我会在客户端代码中使用几个时间戳来实现此目的。我希望我可以将它作为HTTP头提供,因此它可以用于我们的客户端应用程序的调试练习,而无需对API进行修改。 – 2009-05-22 06:52:28

回答

0

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

检查出IClientMessageInspector接口 - 这可能是你正在寻找的。关于如何使用此界面,请参阅此优秀的blog entry

马克

+0

谢谢马克。我可以肯定地向我们的客户端应用程序提出这样的建议,但考虑到它们的数量和种类,我希望能够在后端实施。 – 2009-05-22 06:53:30

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(); 
     } 
    }