是否有任何内置的可能性告诉WCF我希望自定义操作调用程序执行的确切顺序?
一些背景知识:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如:
订单非常重要,因为我需要先确定用户,然后再检查权限。
答案 0 :(得分:1)
是否有任何内置的可能性告诉WCF确切的顺序?
没有。没有WCF接口。
您可以通过配置控制订单吗?
是。通过配置可以预测和控制不同IOperationInvoker的执行顺序。您可以使用它来满足您的要求。
IOperationInvoker背景
Carlos Figueira的博客:WCF Extensibility – 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行为可以添加到几个不同位置的操作:代码,配置文件等。这么多选项可能会导致您的用例混淆(错误)。
如果您的OperationInvokers紧密耦合,我的建议是创建一个自定义行为,以正确的顺序添加所有IOperationInvokers。
因此,虽然您无法“告诉”WCF执行顺序,但您可以预测地控制它。