【问题标题】:WCF - how to connect to specific instanceWCF - 如何连接到特定实例
【发布时间】:2016-06-22 06:38:58
【问题描述】:

使用 WCF、.NET 4.5、Visual Studio 2015,并希望使用按会话实例化,而不是单例。提供的服务是全双工的,通过 tcp.net。

假设我有两台机器,A 和 B...

B 作为客户端,连接到同一台机器 B 上作为 WCF 服务提供的“服务”,并开始与其对话,将其称为对象“X”。它还连接到同一服务的另一个实例,称之为对象“Y”

A 作为客户端,想要连接并使用 B 正在与之交谈的完全相同的对象,即对象“X”和“Y”,但现在它是远程远程的,而不是本地远程的。

“X”和“Y”其实是一个视频服务器,都有“状态”。

我可以这样做吗?当我是客户时,如何指定要连接到哪个服务实例?

显然,在机器“B”上,我可以通过让服务只是没有“状态”的前端来解决这个问题,这些服务与在“B”上运行的一些进程通信,但这需要我编写一堆进程间代码,我讨厌。

机器 B 预计将运行 100 个这样的“视频服务器”实例,每个实例都与本地主(单例)服务通信,并与最终用户机器通信。

我意识到这个问题有点笼统,但它也解决了我在互联网上找不到的问题。

我只是想到了一种可能的,但很杂乱的解决方案:由于主服务是单例的,当最终用户创建服务实例“X”时,它可以通过代理连接到单例主服务给单身人士。然后,单例可以通过回调通道与实例“X”交谈。是的,那会奏效!混乱,但可能。

我仍然想知道最终用户 A 和最终用户 B 是否可以通过一些时髦的通道操作或其他方式与机器 C 上的同一个(非单例)服务实例通信。据我了解 WCF 的规则,这根本是不可能的。如果您自己托管服务而不是 IIS,也许也许,但即便如此,我认为这不可能?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    我遇到了同样的问题,并通过创建两个服务引用来解决它,一个用于本地,一个用于远程。我们称它为LocalServiceClientRemoteServiceClient

    在一个类中,创建一个名为 Client 的属性(或任何你喜欢的名称):

    public LocalServiceClient Client {
         get {
              return new LocalServiceClient();
         }
    }
    

    好的,这仅适用于其中之一。现在只需创建另一个,并使用编译器标志设置使用哪个:

    #if DEBUG
    public LocalServiceClient Client {
         get {
              return new LocalServiceClient();
         }
    }
    #else
    
    public RemoteServiceClient Client {
         get {
              return new RemoteServiceClient();
         }
    }
    #endif
    

    使用 var 关键字实例化您的 Client 的任何实例,因此它将被隐式键入,或者直接使用 Client

    var client = Client;
    client.DoSomething...
    //or
    Client.DoSomething...
    

    这样,当您在本地工作时,它将连接到本地服务,并且在发布配置(发布时确保您在Release)上,它将为远程服务进行编译。确保您在 WCF 端为这两个服务拥有完全相同的签名/代码。

    还有一些方法可以在代码中动态执行,或者像在web.config 中一样,它们当然也可以工作,但它们通常是矫枉过正的。您可能需要在调试中连接到本地的,在生产中连接到远程的,这将为您提供您所需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2017-10-08
      • 2016-05-08
      • 2013-12-09
      相关资源
      最近更新 更多