drs*_*222 11 .net c# wcf remoting
我们希望在同一台机器上运行两个.NET应用程序相互通信.我们想要三个项目.包含接口的库.实现接口的"服务器"应用程序和使用接口与服务器通信的"客户端"应用程序.我们不希望客户端引用服务器.
我们有一个测试应用程序使用远程处理,但最近发现远程处理正在被WCF取代.由于这是新的开发,我们觉得我们应该使用WCF,但我们还没有设法使它与WCF一起使用并且想知道它是否可能?
很抱歉我上面没有详细信息,但我当时无法访问任何代码.我正和另外两个人一起参与这个项目,并没有密切关注他们的IPC内容.我知道他们目前认为WCF无法做他们想做的事情,我希望能够向他们展示它可以.
我已经开始关注我的同事尝试,并将继续按照我的理解更新这篇文章.
下面是他们用于远程处理的测试代码的简化版本.他们希望能够使用WCF执行此操作,但到目前为止还无法使其工作.
ServiceApp和ClientApp程序集都引用Lib程序集.他们没有互相参考.
当我能够更好地解释他们在WCF中复制此行为的尝试时,我将再次编辑它.此时我真正知道的是,他们正在使用NetNamedPipeBinding并且客户端应用程序遇到问题,因为它无法访问服务程序集.
下面是WCF测试代码的简化版本.
ClientProgram的以下行引发异常:
IMessage msg2 = service.CreateMessage("Hello World");
Run Code Online (Sandbox Code Playgroud)
这是一个例外:
Could not load file or assembly 'ServiceApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
在试图理解史蒂文的最新评论时,我用谷歌搜索了IMetadataExchange,这当然是第一次点击MSDN页面.这个页面说:
无需在服务实现中实现MetadataReference协定.而是将ServiceMetadataBehavior添加到服务描述中.
或者,在使用配置时,将端点元素的contract属性设置为IMetadataExchange.有关示例,请参见如何:使用配置文件发布服务的元数据.
有关在WCF中发布元数据的详细信息,请参阅发布元数据.
因为,对于此示例,我不使用配置文件,而是选择转到" 发布元数据"链接.从那里我去了如何:使用代码发布服务的元数据链接,这个例子我用来修改我的服务应用程序代码.添加的代码在第15-20行.
我做了一点工作后就能添加服务参考.该服务必须正在运行,但如果您通过Visual Studio运行该服务,则您无法添加服务引用.此外,我仍然不明白"解决方案中的发现服务"选项应该如何工作.最后,我可以通过打开bin/debug文件夹来手动运行服务然后输入我添加到服务应用程序的URL来添加引用.如果这是正确的方式,那就相当尴尬了.
毕竟,所生成的代码对我来说都没有.首先,它重新创建我的IService接口,但将我的所有IMessages转换为对象并以稍微不同的方式装饰它.如果使用它们的接口,那么它不仅会使用不同的IService,而且我的服务实际上实现了,但是这个IService中的方法甚至没有相同的签名!
把它放在一边我假设我必须更改我的客户端以使用新生成的对象中的对象,所以我更改了我的客户端代码.
现在,当我尝试运行它时,我在第4行得到以下错误:
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:msg. The InnerException message was 'XML 'Element' 'http://tempuri.org/:msg' does not contain expected attribute 'http://schemas.microsoft.com/2003/10/Serialization/:Type'. The deserializer has no knowledge of which type to deserialize. Check that the type being serialized has the same contract as the type being deserialized.'. Please see InnerException for more details.
因为我加了赏金,剩下一天的赏金和没有答案.在赏金时间到来之前,我有什么可以澄清的吗?
最后我们使用了远程处理,因为它看起来不像我们想要做什么就可以使用WCF.Steven Sudit获得了所有帮助的赏金,尽管在我提供奖金之前就已经完成了这一切.
Zac*_*ham 18
WCF是要走的路,特别是检查与WCF的Net Named Pipe绑定.这将允许在同一台机器上进行非常快速的进程间通信.
如果您的生产部署针对Windows Server 2008,那么您可以利用IIS 7作为托管环境.检查使用WAS扩展您的WCF服务超越HTTP.
那里有很多WCF入门类型信息.查看:
如果你有问题入门,然后发布任何特定的错误或示例,你可能已经证明了它,我相信这里有人可以提供帮助!
远程处理有一些用例,例如单个进程内应用程序域之间的通信。话虽如此,是的,WCF 是正确的选择。不过,从您所说的一些内容来看,我不确定您是否理解这是如何运作的。
在 WCF 中执行操作的常用方法是创建一个完全由数据传输对象(所有属性,无代码)和接口组成的共享程序集。双方都引用该程序集,但客户端使用服务器的服务引用。这有帮助吗?
归档时间: |
|
查看次数: |
2333 次 |
最近记录: |