改善が必要なやや不十分な設計の WCF サービスを継承しました。問題の 1 つは、(2 つの異なるインターフェイス上に) 100 を超えるメソッドがあり、そのほとんどが使用されていないことです。各メソッドにログを記録して、いつ、どのように呼び出されたかを追跡することにしました。トレース コードをリファクタリングしやすく、入力ミスを防止するために、次のように実装しました。
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()
次に、トレースする各メソッドの開始時に呼び出されます。
このサービスは非常にトラフィックが多く、1 日あたり 500,000 件以上の通話があります。99.95% の確率で、このコードは美しく実行されます。しかし、残りの 0.05% の時間GetInterfaces()
は、空の (しかし ではないnull
) 配列を返します。
GetInterfaces()
一貫性のない結果が時々返されるのはなぜですか?
これは些細なことのように思えるかもしれません。0.05% のエラー率は、私たちが通常夢見ることしかできないものです。しかし、要点はすべてのサービス タッチポイントを特定することです。このエラーが常に 1 つ (またはいくつか) のメソッド呼び出しから発生する場合、トレースは不完全です。サービスのすべてのメソッドを呼び出して、開発環境でこのエラーを再現しようとしましたが、役に立ちませんでした。