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