Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一Windows服务主机上两个WCF服务库之间的通信_Wcf_Appdomain - Fatal编程技术网

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

同一Windows服务主机上两个WCF服务库之间的通信,wcf,appdomain,Wcf,Appdomain,我目前正在处理的项目包括一个服务器,它从客户端接收C#脚本(部分代码),将其打包以创建一个完整的类,对其进行编译,然后将其加载到单独的AppDomain中执行 任务(当前正在运行的脚本)可以在其执行的任何时候向用户发送反馈,如用户在脚本中定义的那样。并且任务可能会等待用户的响应(目前假设只有在发送反馈之后才正确)。用户可能会在任何时候决定终止任务 服务器实现为承载WCF服务库的Windows服务 由于我不想使客户端过于复杂,从而使其直接与动态创建的AppDomains通信,因此在进行一些研究后,

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

任务(当前正在运行的脚本)可以在其执行的任何时候向用户发送反馈,如用户在脚本中定义的那样。并且任务可能会等待用户的响应(目前假设只有在发送反馈之后才正确)。用户可能会在任何时候决定终止任务

服务器实现为承载WCF服务库的Windows服务

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

我的问题是,现在我想不出一个干净的方式让这两个WCF服务进行交互

我的想法是:

  • 让他们保持彼此的直接联系: 正常情况下,这两项服务都是单件服务,所以应该不难做到。 但是,如果其中一个出现故障,需要重新启动,那么要保持这种状态将是一件痛苦的事情。(我对WCF还是新的,所以我不知道这有多么普遍,但它仍然是一个需要考虑的问题。我想)
  • 引入某种类型的“消息队列”(或两个,每个方向一个),其属性可以设置和订阅。因此,当一个服务设置属性时,将在第二个服务中触发一个事件。但这让我觉得有点不舒服,尽管我真的想不出任何明确的问题
  • 我真的可以在我想要完成的事情上使用一些专家的意见,无论是对我的想法的意见还是新的想法。即使这涉及到重新思考架构。当然,只要有足够的理由这样做,这个项目仍然处于足够早期的阶段,可以承受一些返工

    由于我已经花了大量的精力(阅读:2分钟在油漆上)准备了一个快速(阅读:无用)的系统架构,我将把它链接到这里,因为我没有发布图像的声誉:


    编辑:

    因为我现在有了一个向上投票的名声:


    在重读我的问题之后,我觉得也许我从一个过于狭隘的角度看待这个问题,把服务看作比普通类更特殊的东西。我想得越多,就越觉得observer模式可能是最好的方法。

    只是为了记录在案,为了避免我的(愚蠢的)问题得不到回答,我意识到我试图找到一个特定于WCF服务的解决方案,这一点看得太狭隘了。
    最后,我使用了一种观察者模式的变体(基于)。我遇到了同样的问题。我处理两台服务器之间双工通信的方式如下:

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

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

    9-对Client2代理服务2-Service1通信重复步骤6-8。

    实际上,你的问题一点也不傻。我正在运行的一个项目与此架构大致相同,使用2.0远程处理跨越内部appdomaon边界。我正在用wcf服务替换它。此外,在自己的appdomaon边界内运行“脚本”是很有意义的——这是一种隔音功能,使您能够按需废弃整个域f.ex