繁体   English   中英

如何在同一项目中使用两个服务强制执行WCF事务流合同?

[英]How to enforce WCF transaction flow contracts with two services in the same project?

我刚刚阅读了一篇有关WCF事务和流程的精彩文章 几乎只有一个问题没有解决:

我有一个定义了两个服务方法的项目

ServiceA.svc

   [OperationBehavior(TransactionScopeRequired = true)]
   OperationA()


ServiceB.svc

  [OperationBehavior(TransactionScopeRequired = true)]
  OperationB()

OperationA()需要调用OperationB()

我可以很容易地从ServiceA说出new ServiceB().OperationB(...) (请记住,我说它们位于同一服务器上运行的同一Web项目中。

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

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

(也好奇当一个操作在同一个类中调用另一个操作时如何执行此操作,但这对于Google来说可能更容易实现)

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中执行此操作的正确方法。

希望这个对你有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM