Перехват вызова - Как определить, является ли вызов системным вызовом
Я пытаюсь создать метод перехвата, который обрабатывает только несистемные вызовы. Согласно документам, системные и несистемные вызовы перехватываются:
Фильтры исходящих вызовов зерна вызываются для всех вызовов метода в зерне, и это включает в себя вызовы системных методов, сделанные Орлеаном.
Однако я не могу найти способ провести различие, используя какой-либо публичный метод или свойство. Я что-то пропустил?
1 ответ
Решение
Я могу думать о двух интерпретациях того, что системный вызов может быть здесь:
- Любой вызов
ISystemTarget
- Любой вызов интерфейса, определенного в одной из сборок Орлеана
В случае любого из них самый простой способ определить, соответствует ли вызов этому критерию, состоит в использовании InterfaceMethod
свойство контекста, который передается в фильтр вызовов для проверки DeclaringType
того, что MethodInfo
,
Например:
siloBuilder.AddOutgoingGrainCallFilter(async context =>
{
var declaringType = context.InterfaceMethod?.DeclaringType;
// Check if the type being called belongs to one of the Orleans assemblies
// systemAssemblies here is a HashSet<Assembly> containing the Orleans assemblies
var isSystemAssembly = declaringType != null
&& systemAssemblies.Contains(declaringType.Assembly);
// Check if the type is an ISystemTarget
var systemTarget = declaringType != null
&& typeof(ISystemTarget).IsAssignableFrom(declaringType);
if (isSystemAssembly || systemTarget)
{
// This is a system call, so just continue invocation without any further action
await context.Invoke();
}
else
{
// This is an application call
// ... Inspect/modify the arguments here ...
await context.Invoke();
// ... inspect/modify return value here ...
}
})