远程处理或WCF用于新开发(在同一台机器上的两个.NET应用程序之间)使用接口?

我们希望在同一台机器上运行两个.NET应用程序相互通信。 我们想要三个项目。 包含接口的库。 实现接口的“服务器”应用程序和使用接口与服务器通信的“客户端”应用程序。 我们不希望客户端引用服务器。
我们有一个测试应用程序使用远程处理,但最近发现远程处理正在被WCF取代。 由于这是新的开发,我们觉得我们应该使用WCF,但是我们还没有设法使它与WCF一起使用并且想知道它是否可能?


编辑:

很抱歉我上面没有详细信息,但我当时无法访问任何代码。 我正与这个项目的另外两个人一起工作,并没有密切关注他们的IPC内容。 我知道他们目前认为WCF无法做他们想做的事情,我希望能够向他们展示它可以。

我已经开始关注我的同事尝试,并将继续按照我的理解更新这篇文章。

下面是他们用于远程处理的测试代码的简化版本。 他们希望能够使用WCF执行此操作,但到目前为止还无法使其工作。

  • Lib \ IMessage.cs
  • Lib \ IService.cs
  • ServiceApp \ Service.cs
  • ServiceApp \ ServiceMessage.cs
  • ServiceApp \ ServiceProgram.cs
  • ClientApp \ ClientProgram.cs

ServiceApp和ClientApp程序集都引用Lib程序集。 他们没有互相参考。

当我能够更好地解释他们在WCF中复制此行为的尝试时,我将再次编辑它。 此时我真正知道的是他们正在使用NetNamedPipeBinding并且客户端应用程序遇到问题,他们无法访问服务程序集。


编辑:

下面是WCF测试代码的简化版本。

  • Lib \ IMessage.cs
  • Lib \ IService.cs
  • ServiceApp \ Service.cs
  • ServiceApp \ ServiceMessage.cs
  • ServiceApp \ ServiceProgram.cs
  • ClientApp \ ClientProgram.cs

ClientProgram的以下行引发exception:

IMessage msg2 = service.CreateMessage("Hello World"); 

这是例外:

 无法加载文件或程序集'ServiceApp,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。 该系统找不到指定的文件。 

编辑:

在试图理解史蒂文的最新评论时,我用谷歌搜索了IMetadataExchange,当然这是第一次点击MSDN页面 。 这个页面说:

无需在服务实现中实现MetadataReference协定。 而是将ServiceMetadataBehavior添加到服务描述中。

或者,在使用配置时,将端点元素的contract属性设置为IMetadataExchange。 有关示例,请参见如何:使用配置文件发布服务的元数据。

有关在WCF中发布元数据的详细信息,请参阅发布元数据 。

因为,对于此示例,我不使用配置文件,而是选择转到“ 发布元数据”链接。 从那里我去了如何:使用代码发布服务的元数据链接,这有一个很好的例子,我用来修改我的服务应用程序代码 。 添加的代码在第15-20行。

我做了一点工作后就能添加服务参考。 该服务必须正在运行,但如果您通过Visual Studio运行该服务,则您无法添加服务引用。 此外,我仍然不明白“解决方案中的发现服务”选项应该如何工作。 最后,我可以通过打开bin / debug文件夹来手动运行服务然后输入我添加到服务应用程序的URL来添加引用。 如果这是正确的方式,那就相当尴尬了。

毕竟,所生成的代码对我来说都没有。 首先,它重新创建我的IService接口,但将我的所有IMessages转换为对象并以稍微不同的方式装饰它。 如果使用它们的接口,那么它不仅会使用不同的IService,而且我的服务实际上实现了,但是这个IService中的方法甚至没有相同的签名!

把它放在一边我假设我必须改变我的客户端以使用新生成的对象中的对象,所以我改变了我的客户端代码 。

现在,当我尝试运行它时,我在第4行得到以下错误:

 格式化程序在尝试反序列化消息时抛出exception:尝试反序列化参数http://tempuri.org/:msg时出错。  InnerException消息是'XML'元素''http://tempuri.org/:msg'不包含预期属性'http://schemas.microsoft.com/2003/10/Serialization/:Type'。 反序列化器不知道要反序列化的类型。 检查被序列化的类型与被反序列化的类型具有相同的合同。 有关更多详细信息,请参阅InnerException。 

编辑:

因为我加了赏金,剩下一天的赏金和没有答案。 在赏金时间到来之前,我有什么可以澄清的吗?


编辑:

最后我们使用了远程处理,因为它看起来不像我们想要做什么是WCF。 Steven Sudit得到了所有帮助的赏金,尽管在我提供奖金之前就已经完成了这一切。

远程处理有一些用例,例如单个进程内的appdomains之间的通信。 话虽如此,是的,WCF是要走的路。 但是,从你所说的一些事情来看,我不确定你是否理解这应该如何运作。

在WCF中执行操作的常用方法是创建一个完全由数据传输对象(所有属性,无代码)和接口组成的共享程序集。 双方都引用此程序集,但客户端使用服务器的服务引用。 这有帮助吗?

WCF是要走的路,特别是检查与WCF的Net Named Pipe绑定。 这将允许在同一台机器上进行非常快速的进程间通信。

如果您的生产部署针对Windows Server 2008,那么您可以利用IIS 7作为托管环境。 检查使用WAS扩展您的WCF服务超越HTTP 。

那里有很多WCF入门类型信息。 查看:

  • WCF教程入门
  • WCF Essentials

如果你有问题入门,然后发布任何特定的错误或示例,你可能已经certificate了它,我相信这里有人可以提供帮助!

两者都使用。

绝对适合WCF。

Remoting记录严密且敏感。 相比之下,WCF更容易。 不确定你遇到的问题,但是那里有很多关于WCF的文档。

我刚刚将一个程序从远程处理切换到WCF,我遇到了一些以前在远程处理中无缝工作的东西,但这会导致wcf出现问题:

  • CallContext类消失了。 我用它来传递一些关于例如当前所选语言的信息和一些关于用户的信息。 使用WCF,我必须创建一个MessageInspector,以便将包含此信息的标头添加到每个请求中。
  • 例外不再保持不变。 相反,您需要使用FaultException和FaultContracts。
  • 代理似乎没有那么轻。 我需要处理它们而不是让它们被垃圾收集,否则我的服务就会挂起。 (实际上它甚至不像调用Dispose正确终止代理一样简单,你需要一个相当复杂的try,catch序列,最后调用Close和Abort来处理不同类型的exception。)关闭代理需要一点点我希望我的IoC框架管理代理的问题。

我不是说你应该使用Remoting,我只是说有理由考虑Remoting。 这绝对是设置和开始工作的简单方法。

我想你可能会说我遇到了一些问题只是因为我没有在我的Remoting程序中使用最佳实践。 😛

这里有一个模式可以用WCF做类似Remoting的事情:

  • 3个项目:服务器,客户端,shared.dll
  • 服务器和客户端都引用shared.dll
  • 将带有[ServiceContract]的服务接口放入shared.dll
  • 将服务实现类放入服务器
  • 不要为您的数据类型使用接口
  • 创建只有您希望在客户端和服务器之间共享的逻辑的简单DataContract类型(例如validation)
  • 将您的DataContract数据类型放入shared.dll
  • 不要使用NetDataContractSerializer(就像你似乎在你的代码中做的那样)

当然,这个主题有变化。 例如,对于不同的编译,您可以使用#if在服务器和客户端项目之间共享代码文件,而不是共享的dll。