通话拦截-如何确定通话是否为系统通话

时间:2018-08-13 19:23:03

标签: orleans

我正在尝试创建一种仅处理非系统调用的拦截方法。根据{{​​3}},系统和非系统调用都会被拦截:

  

所有对谷物的方法调用都将调用外出谷物调用过滤器,这包括对奥尔良进行的系统方法的调用。

但是,我找不到使用任何公共方法或属性进行区分的方法。我想念什么吗?

1 个答案:

答案 0 :(得分:3)

我可以想到两种关于系统调用的解释:

  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 ...
    }
})