同一操作上多个IOperationInvoker的顺序

本文关键字:IOperationInvoker 顺序 操作上 | 更新日期: 2023-09-27 18:15:08

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


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

  • 设置活动用户
  • 检查访问权限
  • 设置区域性信息
  • 等。

顺序非常重要,因为我需要首先确定用户,然后才检查权限。

同一操作上多个IOperationInvoker的顺序

是否有任何内置的可能性告诉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执行顺序,但你可以预见地控制它。

相关文章:
  • 没有找到相关文章