返回其他服务的WCF服务

时间:2013-02-28 15:24:55

标签: wcf

WCF服务是否可以返回其他服务?

代码:

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

[ServiceContract]
public interface IServiceB
{


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

正在激活调用ServiceB的ServiceA的表单:

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

当然这是不可能的,因为GetServiceB()返回对象而不是像这样投射时的服务:

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

我收到CommunicationException:“现有连接被远程主机强行关闭”

2 个答案:

答案 0 :(得分:2)

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

另一种解决方法是让ServiceA调用ServiceB,这样客户端只需要与ServiceA进行交互。

答案 1 :(得分:1)

是的,你不能。

  

传递远程引用的这种简单性也是其中之一   .NET Remoting中最大的危险。在很多架构中,   除了一些非常需要远程参考的传输   有限和受控案件。传递MarshalByRefObject而不是   一个[Serializable]对象 - 错误 - 通常导致显着   性能和可扩展性恶化。毕竟:每个方法调用都会   现在必须通过网络旅行,可能跨越多个   城市,国家或大陆。

     

...

     

在WCF中,您可以传递对远程服务的引用,但您必须这样做   非常明确地这样做。它通常不能没有   非常明确的意图。

Ingo

因此 能力(shareable services)来共享服务实例客户端。 Shareable在WCF的Beta1或Beta2中,但在产品的最终版本发布之前被删除。但文章说:

  

您可以重新使用基于.NET Remoting的IRemoteFactory接口和   注释它与WCF兼容

保留引用(clent object graphs)part也很有趣。

今天,您可以在客户端(“共享实例”)与InstanceContextMode.Single(以及自定义客户端 - 服务 - 客户端会话逻辑)或IInstanceContextProvider

之间进行交互