如何对同一项目中的两个服务强制执行WCF事务流契约?

如何对同一项目中的两个服务强制执行WCF事务流契约?,wcf,transactions,Wcf,Transactions,我刚刚读到有关WCF事务和流的信息。几乎只给我留下了一个未回答的问题: 我有一个单一项目,定义了两种服务方法: ServiceA.svc [OperationBehavior(TransactionScopeRequired = true)] OperationA() ServiceB.svc [OperationBehavior(TransactionScopeRequired = true)] OperationB() OperationA()需要调用opera

我刚刚读到有关WCF事务和流的信息。几乎只给我留下了一个未回答的问题:

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

ServiceA.svc

   [OperationBehavior(TransactionScopeRequired = true)]
   OperationA()


ServiceB.svc

  [OperationBehavior(TransactionScopeRequired = true)]
  OperationB()
OperationA()
需要调用
operationab()

我可以很容易地从
ServiceA
中说
newserviceb().OperationB(…)
(记得我说过它们在同一台服务器上运行的同一个web项目中

起初我以为这就是我要做的,但我不确定交易是否都会搞砸——特别是如果两个操作之间的交易合约不同。显然,如果我从
OperationB
中访问
transaction.Current
,那么它将存在,但如果两个操作有不同的contracts(如参考条款所述)不遵守规则

调用
服务b.OperationB()
的正确方法是什么


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

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

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

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

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

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

基本上,您需要的是服务B的服务合同的
ChannelFactory
实例,然后在该通道工厂上调用
CreateChannel()
方法,以获取该服务的实际通道(=客户端代理)。类似于以下内容:

 ChannelFactory<IServiceB> factory = new ChannelFactory<IServiceB>();
 IServiceB clientProxy = factory.CreateChannel();
ChannelFactory工厂=新的ChannelFactory();
IServiceB clientProxy=factory.CreateChannel();
这将获取web.config中的所有详细信息-如果需要,可以在代码中定义绑定和端点,并将它们传递到ChannelFactory的构造函数中

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


希望这能有所帮助!

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

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

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

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

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

基本上,您需要的是服务B的服务合同的
ChannelFactory
实例,然后在该通道工厂上调用
CreateChannel()
方法,以获取该服务的实际通道(=客户端代理)。类似于以下内容:

 ChannelFactory<IServiceB> factory = new ChannelFactory<IServiceB>();
 IServiceB clientProxy = factory.CreateChannel();
ChannelFactory工厂=新的ChannelFactory();
IServiceB clientProxy=factory.CreateChannel();
这将获取web.config中的所有详细信息-如果需要,可以在代码中定义绑定和端点,并将它们传递到ChannelFactory的构造函数中

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


希望这能有所帮助!

这就是我想要的谢谢。我的kindle上有一本WCF的书,但是找到这样的东西很痛苦。另外,我比你上次提到的时候提高了30%:-)这就是我想要的谢谢。我的kindle上有一本WCF的书,但找到这样的东西很痛苦。另外,我比你上次提到的30%高了:-)