Odziedziczyliśmy nieco źle zaprojektowaną usługę WCF, którą chcemy poprawić. Jednym z problemów jest to, że ma ponad sto metod (na dwóch różnych interfejsach), z których większość podejrzewamy, nie są używane. Postanowiliśmy wprowadzić pewne rejestrowanie każdej metody śledzenia, kiedy i jak są wywoływane. Aby kod śledzenia Refactor w obsłudze i typo-dowód wdrożyliśmy go tak:Dlaczego funkcja Type.GetInterfaces() czasami nie zwraca poprawnej listy?
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()
jest wówczas nazywano na początku każdej metody, którą chcemy śledzić.
Usługa jest bardzo dużym natężeniem ruchu, rzędu 500 000 połączeń dziennie. 99,95% czasu, ten kod jest pięknie wykonany. Ale inne 0,05% czasu, GetInterfaces()
zwraca pustą (ale nie null
) tablicę.
Dlaczego by GetInterfaces()
czasami zwracać niespójne wyniki?
To może wydawać się tak banalne - współczynnik błędu 0,05% jest czymś, o czym zwykle możemy tylko pomarzyć. Chodzi jednak o to, aby zidentyfikować punkty kontaktu z usługami i jeśli ten błąd zawsze wychodzi z jednego (lub kilku) wywołań metod, nasze śledzenie jest niekompletne. Próbowałem odtworzyć ten błąd w moim środowisku programistycznym, wywołując każdą metodę w usłudze, ale bezskutecznie.
Niekompletne ślad stosu spowodowane niewłaściwie rethrown wyjątkiem gdzieś? –
Jeśli logujesz się również do 'callingMethod', możesz stwierdzić, że jego typ deklaracji w rzeczywistości nie ma żadnych interfejsów. –
'LogUsage' jest wywoływane tylko z metod wewnątrz dwóch klas, a obie te klasy implementują przynajmniej jeden interfejs. – nateirvin