同一Windows服务主机上的两个WCF服务库之间的通信

时间:2013-04-30 16:23:43

标签: wcf appdomain

我目前正在开发的项目包括一个服务器,它从客户端接收C#脚本(部分代码),包装它以创建一个完整的类,编译它然后将其加载到一个单独的AppDomain中执行。

任务(当前正在运行的脚本)可以在用户执行的任何时刻向用户发送反馈,如用户在脚本中定义的那样。并且可能该任务可能等待来自用户的响应(目前假设它仅在发送反馈之后)。用户可能随时决定杀死任务。

服务器实现为托管WCF服务库的Windows服务。

由于我不想过度复杂化客户端以使其直接与动态创建的AppDomain通信,因此我在一些研究之后考虑的(​​部分)解决方案是托管第二个具有命名管道绑定的WCF服务以生成动态AppDomain将它用作它们与面向WCF服务的客户端之间的中继。

我的问题是,现在我想不出让两个WCF服务交互的干净方法。

我的想法是:

  1. 让他们保持对彼此的直接引用: 通常情况下,这两项服务都是单身,这应该不难做到。 但是,如果其中一个失败并需要重新启动,那将是一种痛苦。 (我还是WCF的新手,所以我不知道它有多常见,但它仍然需要考虑。我想。)
  2. 引入某种“消息队列”(或两个,每个方向一个),其中包含可以设置和订阅的属性。因此,当一个服务设置属性时,将在第二个服务中触发事件。但这对我来说有点不好意思,尽管我真的不能想到任何明确的问题。
  3. 我真的可以在我想要完成的事情上使用一些专家意见,无论是对我的想法或新想法的看法。即使这涉及到重新思考架构。只要有足够的理由去做这个项目,这个项目仍然处于足够早的阶段,可以提供一些返工。

    由于我已经付出了很多努力(阅读:2分钟的油漆)来准备系统的快速(阅读:无用)架构,我会在这里链接它,因为我没有发布图像的声誉: Link to schema


    修改

    因为我现在因为一个upvote而享有声誉: Basic structure

    在重读我的问题之后,我觉得也许我从一个过于狭隘的角度来看这个问题,认为服务是比普通课更特殊的东西。我越是想到它,我越觉得观察者模式可能是最好的方法。

2 个答案:

答案 0 :(得分:0)

仅仅是为了记录,并且为了避免让我的(愚蠢)问题无法回答,我意识到我通过尝试找到特定于WCF服务的解决方案来过于狭隘地看待这个问题。 最后我最终使用了观察者模式的变体(基于IObservable<T>Interface)。

答案 1 :(得分:0)

我遇到了同样的问题。我处理两台服务器之间的双工通信的方式如下:

为每个进程(AppDomain单独的任务)创建一对WCF服务。这两个服务的Instancing都设置为PerSession(不需要单例,从长远来看可能会导致断开等问题)。这意味着客户端将针对每个流程(AppDomain分离的任务)与两个不同的服务实例或服务对(即Service1和Service2)进行通信。 我们希望在这两个服务之间进行双工通信,这意味着两者都可以彼此通信并传递数据(以DataContract类对象的形式)。

为此:     1-声明两项服务(即在单独的类库中)并托管它们(自行托管或其他)。     2-创建您的DataContract类,并根据需要添加任何属性,集合,枚举等。这两个服务都必须具有此类的get-set属性。     3-在同一类库(Service1和2类所在的位置)中,创建另一个类。此类将充当服务对实例的存储库。它具有静态列表,以便注册服务对实例(您可以使用GUID标识每个服务)。     4-我们使用svcUtil.exe(或通过代码)设置了客户端代理。当客户端发出服务请求时,WCF将创建一个服务(即service1)。在service1处,以client2身份创建或启动进程(应用程序域分离的任务),并在其构造函数中通过代码创建Service2代理。     5-初始化Service2实例(即通过调用service2),然后在存储库的静态列表中注册服务对实例(以便以后可以检索以进行双工通信)。现在我们有了两个服务实例,并且它们都成对注册到静态列表中。     6-通过从Client1代理进行呼叫来开始两种服务之间的通信。     7-在Service1调用方法中,从静态列表中检索服务对。使用(2)中提到的get-set属性将Datacontract类对象从Service1深度复制(DeepClone)到Service2。 (请注意,您可以使用Nuget的众多Deep Clone库之一,例如DeepCloner)。     8-从Service2打回电话。现在,Client2具有与Client1 相同的DataContract类属性值     9-对用于Service2-Service1通信的Client2代理重复步骤6-8。

相关问题