我正在使用WCF构建一个Web应用程序,该应用程序将被其他应用程序作为服务使用。我们的应用程序将安装在Web服务场上,并为了可伸缩性目的而进行负载平衡。偶尔我们遇到一个特定于一个Web服务器的问题,我们希望能够从响应中确定请求处理的Web服务器以及可能的时间信息。例如,此请求由WebServer01处理,请求需要200ms才能完成。
首先想到的解决方案是构建一个ISAPI过滤器,以添加一个HTTP头,该头在响应中存储此信息。这让我觉得有些人以前必须做的事情。有没有更好的方法来实现这一点,或者我可以使用现成的ISAPI过滤器?
提前致谢
答案 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();
}
}