【问题标题】:How to enforce WCF transaction flow contracts with two services in the same project?如何在同一个项目中使用两个服务强制执行 WCF 事务流合同?
【发布时间】:2009-12-20 09:03:25
【问题描述】:

我刚刚阅读了a fantastic article 关于 WCF 事务和流程的信息。几乎只给我留下了一个未回答的问题:

我有一个单个项目,其中定义了两种服务方法:

ServiceA.svc

   [OperationBehavior(TransactionScopeRequired = true)]
   OperationA()


ServiceB.svc

  [OperationBehavior(TransactionScopeRequired = true)]
  OperationB()

OperationA()需要拨打OperationB()

我可以很容易地从ServiceA 中说出new ServiceB().OperationB(...)(记住我说过它们在同一台服务器上运行的同一个网络项目中。

起初我以为我会这样做,但我不确定交易是否会全部搞砸 - 特别是如果两个操作之间的交易合同不同。显然,如果我从OperationB 中访问Transaction.Current,那么它将存在,但如果这两个操作有不同的合同(如参考文章中所述),则不会遵循规则。

ServiceA.OperationA() 调用ServiceB.OperationB() 的正确方法是什么?

(很好奇当一个操作调用同一个类中的另一个操作时如何做到这一点,但这可能更容易用谷歌搜索)

【问题讨论】:

    标签: wcf transactions


    【解决方案1】:

    WCF 的基本假设是您总是通过客户端代理调用服务方法。此行为允许 WCF 运行时进入调用堆栈并发挥其所有魔力。

    因此,在您的情况下,如果您想从 ServiceA 调用 ServiceB,您应该在 ServiceA 中为 ServiceB 创建一个客户端代理,并在该客户端代理上调用 ServiceBClientProxy.OperationB()

    您可以通过多种方式创建客户端代理:

    • 通过 Visual Studio“添加服务引用”对话框,在幕后基本上只是调用svcutil.exe 命令行实用程序,您也可以直接调用它。这会创建很好的代理和所有但可怕的配置

    • 由于这两个服务在同一个项目中,所以两者都可以访问彼此的合同,对吗?在这种情况下,您可以在几行代码中手动创建客户端代理。

    基本上,您需要的是 ServiceB 的服务合同的 ChannelFactory<T> 实例,然后调用该通道工厂上的 CreateChannel() 方法以获取该服务的实际通道(= 客户端代理)。像这样的:

     ChannelFactory<IServiceB> factory = new ChannelFactory<IServiceB>();
     IServiceB clientProxy = factory.CreateChannel();
    

    这会从 web.config 中获取所有详细信息 - 如果需要,您可以在代码中定义绑定和端点,并将它们传递给 ChannelFactory 的构造函数。

    现在您有了 ServiceB 的客户端代理,您可以调用它的所有方法。这是在 WCF 中正确的做法。

    希望这会有所帮助!

    【讨论】:

    • 这就是我想要的谢谢。我的 Kindle 上有一本 WCF 书,但很难找到这样的东西。附言。我比你上次提到的时候涨了 30% :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多