C# 同一操作上多个IOperationInvoker的顺序

C# 同一操作上多个IOperationInvoker的顺序,c#,wcf,C#,Wcf,是否有任何内置的可能性告诉WCF我希望自定义操作调用程序执行的确切顺序 一些背景:我在WCF中有几个自定义操作调用程序,每个调用程序执行一个任务,如: 设置活动用户 检查访问权限 设置区域性信息 等等 顺序非常重要,因为我需要首先确定用户,然后才检查权限 是否有任何内在的可能性告诉WCF确切的订单 没有。没有WCF接口来实现这一点 你能通过配置来控制订单吗 对。不同IOperationInvoker的执行顺序可以通过配置进行预测和控制。您可以使用它来满足您的需求 IOperationInv

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


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

  • 设置活动用户
  • 检查访问权限
  • 设置区域性信息
  • 等等
顺序非常重要,因为我需要首先确定用户,然后才检查权限

是否有任何内在的可能性告诉WCF确切的订单

没有。没有WCF接口来实现这一点

你能通过配置来控制订单吗

对。不同IOperationInvoker的执行顺序可以通过配置进行预测和控制。您可以使用它来满足您的需求

IOperationInvoker背景

Carlos Figueira的博客:给出了一个自定义调用程序的示例。可能有太多的信息,但它显示了多个调用程序是如何链接在一起的,以及它们是如何通过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执行顺序,但可以预见地控制它