c# - 使用接口(interface)进行远程或 WCF 的新开发(在同一台机器上的两个 .NET 应用程序之间)?

标签 c# .net wcf remoting

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

编辑:

抱歉我上面没有详细说明,但当时我无法访问任何代码。我在这个项目上和另外两个人一起工作,并没有仔细研究他们的 IPC 东西。我知道他们目前认为 WCF 不能做他们想做的事,我希望能够向他们展示它可以。

我已经开始研究我的同事在这方面的尝试,并将继续按照我的理解更新这篇文章。

下面是他们用于远程处理的测试代码的简化版本。他们希望能够使用 WCF 做到这一点,但到目前为止还无法让它发挥作用。

  • 图书馆\IMessage.cs
  • 图书馆\IService.cs
  • ServiceApp\Service.cs
  • ServiceApp\ServiceMessage.cs
  • ServiceApp\ServiceProgram.cs
  • ClientApp\ClientProgram.cs

  • ServiceApp 和 ClientApp 程序集都引用 Lib 程序集。它们不相互引用。

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

    编辑:

    下面是 WCF 测试代码的简化版本。
  • 图书馆\IMessage.cs
  • 图书馆\IService.cs
  • ServiceApp\Service.cs
  • ServiceApp\ServiceMessage.cs
  • ServiceApp\ServiceProgram.cs
  • ClientApp\ClientProgram.cs

  • ClientProgram 中的以下行引发异常:
    IMessage msg2 = service.CreateMessage("Hello World");
    

    这是异常(exception):

    无法加载文件或程序集“ServiceApp,版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

    编辑:

    为了理解史蒂文的最新评论,我在谷歌上搜索了 IMetadataExchange,它当然第一次点击了 MSDN Page。 .这个页面说:

    There is no need to implement the MetadataReference contract in your service implementation. Instead, add the ServiceMetadataBehavior to the service description.

    Or, when using configuration, set the contract attribute of the endpoint element to IMetadataExchange. For an example, see How to: Publish Metadata for a Service Using a Configuration File.

    For details on publishing metadata in WCF see Publishing Metadata.



    因为,对于这个例子,我没有使用配置文件,而是选择转到 Publishing Metadata关联。从那里我去了How to: Publish Metadata for a Service Using Code链接有一个很好的例子,我用来修改我的 service app code .添加的代码位于第 15-20 行。

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

    毕竟,code generated对我没有任何好处。首先,它重新创建了我的 IService 接口(interface),但将我所有的 IMessage 转换为对象并稍微不同地装饰它。如果使用它们的接口(interface),那么它不仅会使用不同的 IService,而且我的服务实际实现,而且这个 IService 中的方法甚至没有相同的签名!

    抛开这一点,我假设我必须更改我的客户端才能使用新生成的对象中的对象,所以我更改了我的 client code .

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

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

    编辑:

    自从我添加了赏金后,一天没有回答赏金了。在赏金时间结束之前有什么我可以澄清的吗?

    编辑:

    最后我们选择了远程处理,因为它看起来好像我们想要做的事情用 WCF 是不可能的。史蒂文·苏迪特 (Steven Sudit) 的所有帮助都得到了赏金,尽管这一切都发生在我提供赏金之前。

    最佳答案

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

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

    关于c# - 使用接口(interface)进行远程或 WCF 的新开发(在同一台机器上的两个 .NET 应用程序之间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452268/

    相关文章:

    c# - 取消对 SSRS 的长时间运行的异步 WCF 调用

    c# - 用可用字体列表填充 ComboBox

    c# - Microsoft Web API 生成 WSDL 的最简单途径

    c# - 从内容页访问 MasterPage 上 UserControl 的属性

    WCF SOAP 1.2 服务需要 SOAP 1.1 内容类型

    .net - WCF 安全性,TCP 还是 http?

    c# - WPF MVVM 等待 : Cancel task does not stop my progressbar

    c# - 在 Prism 6 中使用 ViewModelLocator 在分离的程序集中解析 ViewModel

    .net - WinSCP 获取文件创建日期

    c# - 如何将多态引入实体数据模型