我正在尝试创建一种仅处理非系统调用的拦截方法。根据{{3}},系统和非系统调用都会被拦截:
所有对谷物的方法调用都将调用外出谷物调用过滤器,这包括对奥尔良进行的系统方法的调用。
但是,我找不到使用任何公共方法或属性进行区分的方法。我想念什么吗?
答案 0 :(得分:3)
我可以想到两种关于系统调用的解释:
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 ...
}
})