多个IOperationInvoker的顺序在同一操作上

时间:2014-07-28 12:14:33

标签: c# wcf

是否有任何内置的可能性告诉WCF我希望自定义操作调用程序执行的确切顺序?


一些背景知识:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如:

  • 设置有效用户
  • 检查访问权限
  • 设置文化信息

订单非常重要,因为我需要先确定用户,然后再检查权限。

1 个答案:

答案 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执行顺序,但您可以预测地控制它。