Перехват вызова - Как определить, является ли вызов системным вызовом

Я пытаюсь создать метод перехвата, который обрабатывает только несистемные вызовы. Согласно документам, системные и несистемные вызовы перехватываются:

Фильтры исходящих вызовов зерна вызываются для всех вызовов метода в зерне, и это включает в себя вызовы системных методов, сделанные Орлеаном.

Однако я не могу найти способ провести различие, используя какой-либо публичный метод или свойство. Я что-то пропустил?

1 ответ

Решение

Я могу думать о двух интерпретациях того, что системный вызов может быть здесь:

  1. Любой вызов ISystemTarget
  2. Любой вызов интерфейса, определенного в одной из сборок Орлеана

В случае любого из них самый простой способ определить, соответствует ли вызов этому критерию, состоит в использовании 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 ...
    }
})
Другие вопросы по тегам