gpt4 book ai didi

c# - 为什么 Type.GetInterfaces() 有时不返回有效列表?

转载 作者:太空狗 更新时间:2023-10-29 21:28:54 24 4
gpt4 key购买 nike

我们继承了一个设计不佳的 WCF 服务,我们希望对其进行改进。它的一个问题是它有一百多个方法(在两个不同的接口(interface)上),我们怀疑其中的大部分都没有被使用。我们决定对每个方法进行一些记录,以跟踪调用它们的时间和方式。为了使跟踪代码重构友好和防止打字错误,我们这样实现它:

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% 的错误率通常是我们梦寐以求的。但重点是识别所有服务接触点,如果此错误总是来自一个(或几个)方法调用,那么我们的跟踪是不完整的。我试图通过调用服务上的每个方法在我的开发环境中重现此错误,但无济于事。

最佳答案

StackTrace 是出了名的不可靠,尤其是在多线程环境中。或者更确切地说,它非常可靠,但有时不太实用。询问“最后调用的方法”可能会产生意想不到的结果。尝试记录 DeclaringType。您可能会对在那里的发现感到惊讶。请注意,虽然现在这是 0.05% 的失败率,但它可能会随着应用程序的复杂性而轻松增加。

为了正确实现可重用跟踪代码,您需要依赖 .NET 4.5 功能 Caller Information ,通过使用动态代理(例如 Castle Dynamic Proxy ),或通过使用 AOP 框架,例如 PostSharp .或者,您可以手动编写代码跟踪。

关于c# - 为什么 Type.GetInterfaces() 有时不返回有效列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com