【问题标题】:WCF Named Pipe IPCWCF 命名管道 IPC
【发布时间】:2011-03-05 05:40:55
【问题描述】:

这周我一直在努力跟上命名管道的速度。我试图与他们一起解决的任务是我有一个现有的 Windows 服务,它充当设备驱动程序,将数据从外部设备汇集到数据库中。现在我必须修改这个服务并添加一个可选的用户前端(在同一台机器上,使用一种 IPC 形式),它可以监控设备和数据库之间传递的数据,并将一些命令发送回服务.

我对 IPC 的最初想法是命名管道或内存映射文件。到目前为止,我一直在使用 WCF Tutorial Basic Interprocess Communication 解决命名管道的想法。我的想法是使用一个额外的线程来设置 Windows 服务,该线程实现 WCF NamedPipe 服务并将其用作我的驱动程序内部的管道。

我的示例代码可以运行,但是我无法解决 2 个问题,我希望这里的人可以帮助我:

  1. 在本教程中,ServiceHost 使用 typeof(StringReverser) 进行实例化,而不是通过引用具体类。因此,似乎没有服务器与服务本身交互的机制(在 host.Open() 和 host.Close() 行之间)。是否可以在服务器和实际实现服务的类之间创建链接并传递信息?如果有,怎么做?

  2. 如果我运行一个服务器实例,然后运行多个客户端实例,似乎每个客户端都会获得一个单独的服务类实例。我尝试向实现服务的类添加一些状态信息,它只保留在命名管道的实例中。这可能与第一个问题有关,但无论如何强制命名管道使用实现服务的类的相同实例?

  3. 最后,对 MMF 与命名管道有什么想法?

编辑 - 关于解决方案

根据 Tomasr 的回答,解决方案在于使用正确的构造函数来提供实现服务的具体单例类 (ServiceHost Constructor (Object, Uri[]))。当时我不欣赏的是他提到确保服务类是线程安全的。天真地只是更改构造函数导致服务器崩溃,这最终导致我从这篇博客条目Instancecontextmode And Concurrencymode 了解 InstanceContextMode。设置正确的上下文很好地完成了解决方案。

【问题讨论】:

标签: wcf named-pipes netnamedpipebinding


【解决方案1】:

对于 (1) 和 (2),答案很简单:您可以要求 WCF 使用服务的单例实例来处理所有请求。大多数情况下,您需要做的就是使用替代的 ServiceHost constructor,它采用 Object 实例而不是类型。

但是请注意,您将负责确保您的服务类线程安全。

至于 3,这在很大程度上取决于您需要做什么、您的性能需求、您期望同时有多少客户、您将移动的数据量以及需要移动多长时间可用等。

【讨论】:

  • 好吧,既然您向我指出了正确的构造函数,那就是一个完整的 D'Oh!谢谢。至于性能,最终的系统实际上只是一个客户端到一个服务器,但会移动适量的数据。我喜欢命名管道的想法,因为我可以看到如何设置它来移动结构化对象,而且似乎 MMF 的结构化程度较低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多