Я добавил значение в словарь InvocationContext
, однако он не сохраняется для следующего вызова. то есть каждый вызов в цепочке, которая перехвачена, возвращает false для InvocationContext.ContainsKey("tracing-id")
.InvocationContext не сохраняется содержание
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Guid tracingId;
if (!input.InvocationContext.ContainsKey(TRACING_ID))
{
tracingId = _tracingIdProvider.NewTracingId();
input.InvocationContext.Add(TRACING_ID, tracingId);
}
else
{
tracingId = (Guid)input.InvocationContext[TRACING_ID];
}
var methodReturn = getNext()(input, getNext);
return methodReturn;
}
Я могу добавить запись в InvocationContext
, однако, когда getNext()(input, getNext)
вызывается и следующий вызов перехватили InvocationContext
пуст.
Я не понимаю, как используется InvocationContext
? Если да, то каков правильный способ сохранить что-то вроде идентификатора от одного вызова метода к следующему?
Какой перехватчик вы используете? – cynic
«InterfaceInterceptor» – BanksySan
Я кратко рассмотрел исходный код Unity, и перехват интерфейса является наименее читаемым из-за того, что все генерирование кода происходит. Можете ли вы попробовать с прозрачным прокси-перехватчиком или перехватчиком виртуальных методов, если это возможно? Если эти работы, реализация перехвата интерфейса может просто иметь ошибку. В любом случае вы можете использовать локальное хранилище потоков или встроенный CallContext для достижения желаемого. – cynic