【发布时间】:2012-09-21 22:33:21
【问题描述】:
我们继承了我们想要改进的设计不佳的 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% 的错误率是我们通常只能梦想的事情。但关键是要识别所有服务接触点,如果这个错误总是来自一个(或几个)方法调用,那么我们的跟踪是不完整的。我尝试通过调用服务上的每个方法在我的开发环境中重现此错误,但无济于事。
【问题讨论】:
-
由于某处不正确地重新抛出异常而导致堆栈跟踪不完整?
-
如果你也记录
callingMethod,你可能会发现它的声明类型实际上没有接口。 -
LogUsage只能从两个类中的方法调用,并且这两个类都实现了至少一个接口。
标签: c# wcf reflection