C# 同一操作上多个IOperationInvoker的顺序
是否有任何内置的可能性告诉WCF我希望自定义操作调用程序执行的确切顺序C# 同一操作上多个IOperationInvoker的顺序,c#,wcf,C#,Wcf,是否有任何内置的可能性告诉WCF我希望自定义操作调用程序执行的确切顺序 一些背景:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如: 设置活动用户 检查访问权限 设置区域性信息 等等 顺序非常重要,因为我需要首先确定用户,然后才检查权限 是否有任何内在的可能性告诉WCF确切的订单 没有。没有WCF接口来实现这一点 你能通过配置来控制订单吗 对。不同IOperationInvoker的执行顺序可以通过配置进行预测和控制。您可以使用它来满足您的需求 IOperationInv
一些背景:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如:
- 设置活动用户
- 检查访问权限
- 设置区域性信息
- 等等
public class CacheableOperationAttribute : Attribute, IOperationBehavior
{
// omitting lots of code...
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new CachingOperationInvoker(dispatchOperation.Invoker, this.secondsToCache);
}
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
// do this invokers work before others?...
// at some point call the next invoker
object result = this.originalInvoker.Invoke(instance, inputs, out outputs);
// do this invokers work after others?...
return result;
}
}
调用程序存储前一个调用程序:
public class CachingOperationInvoker : IOperationInvoker
{
// omitting lots of code...
public CachingOperationInvoker(IOperationInvoker originalInvoker, double cacheDuration)
{
this.originalInvoker = originalInvoker;
this.cacheDuration = cacheDuration;
}
}
然后调用程序方法如下所示:
public class CacheableOperationAttribute : Attribute, IOperationBehavior
{
// omitting lots of code...
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new CachingOperationInvoker(dispatchOperation.Invoker, this.secondsToCache);
}
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
// do this invokers work before others?...
// at some point call the next invoker
object result = this.originalInvoker.Invoke(instance, inputs, out outputs);
// do this invokers work after others?...
return result;
}
}
注意:您需要知道调用器实现(当调用堆栈中的下一个调用器时),以完全了解多个调用器是如何排序的。在这方面没有规则或惯例(有充分的理由)
配置
WCF行为可以在两个不同的位置添加到操作中:代码、配置文件等。如此多的选项可能会导致用例混淆(bug)
如果您的OperationInvoker是紧密耦合的,我的建议是创建一个自定义行为,以正确的顺序添加所有IOOperationInvoker。
因此,虽然您不能“告诉”WCF执行顺序,但可以预见地控制它