同一操作上多个IOperationInvoker的顺序
本文关键字:IOperationInvoker 顺序 操作上 | 更新日期: 2023-09-27 18:15:08
是否有任何内置的可能性来告诉WCF我想要执行的自定义操作调用程序的确切顺序?
一些背景:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如:
- 设置活动用户
- 检查访问权限
- 设置区域性信息
- 等。
顺序非常重要,因为我需要首先确定用户,然后才检查权限。
是否有任何内置的可能性告诉WCF确切的顺序?
。没有WCF接口。
你能通过配置来控制订单吗?
是的。不同IOperationInvoker的执行顺序可以通过配置进行预测和控制。你可以用它来满足你的需求。
<<p> IOperationInvoker背景/strong>Carlos Figueira的博客:WCF可扩展性- IOperationInvoker给出了一个自定义调用程序的例子。可能信息太多了,但它展示了多个调用程序是如何链接在一起的,以及它们是如何通过WCF行为配置和应用于操作的。
我的观点是:OperationInvoker是拦截器。每次向操作中添加新的调用程序时,都会存储前一个调用程序。
换句话说,从示例中应用调用者的行为看起来像这样:
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 class CachingOperationInvoker : IOperationInvoker
{
// omitting lots of code...
public CachingOperationInvoker(IOperationInvoker originalInvoker, double cacheDuration)
{
this.originalInvoker = originalInvoker;
this.cacheDuration = cacheDuration;
}
}
然后调用器方法看起来像这样:
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)。
如果你的OperationInvokers是紧密耦合的,我的建议是创建一个单一的自定义行为,以正确的顺序添加所有的IOperationInvokers
所以,虽然你不能"告诉"WCF执行顺序,但你可以预见地控制它。