我们继承了我们想要改进的设计不佳的 WCF 服务。它的一个问题是它有一百多个方法(在两个不同的接口上),我们怀疑其中大部分没有使用。我们决定对每个方法进行一些日志记录,以跟踪它们何时以及如何被调用。为了使跟踪代码易于重构和防错字,我们这样实现它:
public void LogUsage()
{
try
{
MethodBase callingMethod = new StackTrace().GetFrame(1).GetMethod();
string interfaceName = callingMethod.DeclaringType.GetInterfaces()[0].Name;
_loggingDao.LogUsage(interfaceName, callingMethod.Name, GetClientAddress(), GetCallingUrl());
}
catch (Exception exception)
{
_legacyLogger.Error("Error in usage tracking", exception);
}
}
LogUsage()
然后在我们要跟踪的每个方法的开头调用。
该服务的流量非常高,每天大约有 500,000 多个呼叫。99.95% 的时间里,这段代码执行得很漂亮。但另外 0.05% 的时间,GetInterfaces()
返回一个空(但不是null
)数组。
为什么GetInterfaces()
偶尔会返回不一致的结果?
这似乎微不足道——0.05% 的错误率是我们通常只能梦想的。但关键是要识别所有的服务接触点,如果这个错误总是来自一个(或几个)方法调用,那么我们的跟踪是不完整的。我试图通过调用服务上的每个方法来在我的开发环境中重现此错误,但无济于事。