2013-02-28 140 views
0

WCF服务能否返回其他服务?返回其他服务的WCF服务

代码:

[ServiceContract] 
public interface IServiceA 
{ 
    [OperationContract] 
    IServiceB GetServiceB(); 

[ServiceContract] 
public interface IServiceB 
{ 


public class ServiceA : IServiceA 
{ 
    public IServiceB GetServiceB() 
    { 
     return new ServiceB(); 
    } 

,这是激活ServiceA形式调用ServiceB:铸造这样当

public partial class Form1 : Form 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
     ServiceReference1.ServiceAClient client = new 
      ServiceReference1.ServiceAClient(); 
     IServiceB serviceB = client.GetServiceB(); 

Ofcourse这不能因为GetServiceB进行()返回对象,而不是服务:

IServiceB serviceB = (ServiceB) client.GetServiceB(); 

我得到CommunicationException:“现有连接w由远程主机强行关闭“

+0

YPU为什么要这么做呢?只需从客户端调用ServiceB! – Jocke 2013-02-28 15:28:07

+0

我只想要1个端点。ServiceA将向我展示许多对象,我不想要许多端点 – ilansch 2013-02-28 15:28:54

+0

您正在寻找的是发现服务体系结构 – Dhawalk 2013-02-28 15:44:12

回答

1

是的,你不能。

传递远程引用的这种简单性也是.NET Remoting中最大的危险之一。在许多体系结构中,除了一些非常有限的和受控的情况外,并不希望传输远程引用。传递一个MarshalByRefObject而不是 [Serializable]对象 - 通常会导致性能和可伸缩性的恶化。毕竟:每个方法调用 现在必须通过网络,可能跨越多个城市,国家或大陆的多个 。

...

在WCF可以传递到远程服务的引用,但是你必须要 约这样做很明确的。通常不能没有 非常明确的意图。

通过Ingo

所以有共享服务实例的能力(shareable services)acrоss客户。可共享的是WCF的Beta1或Beta2版本,但在产品最终版本发布之前已经被切断。不过,文章说:

可以重新使用.NET远程基础IRemoteFactory接口和 注释它是兼容WCF

保留引用(克伦特对象图)part很有趣了。

今天,你可以用InstanceContextMode.Single(和自定义客户服务与客户的对话逻辑)客户端(“共享实例”)之间的相互作用或IInstanceContextProvider

2

不,您不能这样做 - 您的客户端需要ServiceB端点的配置数据。

解决此问题的另一种方法是让ServiceA调用ServiceB,这样您的客户端只需与ServiceA进行交互即可。

+0

我该怎么做? – ilansch 2013-03-01 06:48:57

+0

只需使用ServiceA作为ServiceB的客户端即可 – SalientBrain 2013-03-01 12:04:24