我目前正在开发的项目包括一个服务器,它从客户端接收C#脚本(部分代码),包装它以创建一个完整的类,编译它然后将其加载到一个单独的AppDomain中执行。
任务(当前正在运行的脚本)可以在用户执行的任何时刻向用户发送反馈,如用户在脚本中定义的那样。并且可能该任务可能等待来自用户的响应(目前假设它仅在发送反馈之后)。用户可能随时决定杀死任务。
服务器实现为托管WCF服务库的Windows服务。
由于我不想过度复杂化客户端以使其直接与动态创建的AppDomain通信,因此我在一些研究之后考虑的(部分)解决方案是托管第二个具有命名管道绑定的WCF服务以生成动态AppDomain将它用作它们与面向WCF服务的客户端之间的中继。
我的问题是,现在我想不出让两个WCF服务交互的干净方法。
我的想法是:
我真的可以在我想要完成的事情上使用一些专家意见,无论是对我的想法或新想法的看法。即使这涉及到重新思考架构。只要有足够的理由去做这个项目,这个项目仍然处于足够早的阶段,可以提供一些返工。
由于我已经付出了很多努力(阅读:2分钟的油漆)来准备系统的快速(阅读:无用)架构,我会在这里链接它,因为我没有发布图像的声誉: Link to schema
修改
因为我现在因为一个upvote而享有声誉:
在重读我的问题之后,我觉得也许我从一个过于狭隘的角度来看这个问题,认为服务是比普通课更特殊的东西。我越是想到它,我越觉得观察者模式可能是最好的方法。
答案 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。