【问题标题】:Beginner WCF Setup / Implementation Design Approach初学者 WCF 设置/实现设计方法
【发布时间】:2011-07-16 20:36:11
【问题描述】:

VS2008 中的解决方案见下图,它在 Cient 和 Host 之间实现 WCF。客户端是一个简单的 Windows 窗体应用程序,主机是一个控制台应用程序。我打算使用 Windows 服务作为主机,但现在我使用控制台应用程序来简化和调试。

两者之间的通信是使用netNamedPipeBinding的DCCService(WCF部分);客户端和主机都将驻留在同一台机器上。另外,我知道将 WCF 服务与主机分开是一种很好的做法,这样主机就可以轻松更改,这对我来说很好。


这是我的难题:应该在哪里完成客户要求的工作?

我希望我的服务做的工作是在后台以设定的时间间隔不断地轮询硬件控制器。而 DCCService 向任何想要了解此数据的客户端公开方法。

硬件控制器代码(setup()、connect()、work() 等)应该在 DCCService Project 还是 Host Project 中完成?如果在 Host Project 中完成,DCCService 类如何从 Host 项目中的 Controller 类中抓取数据?同样,如果 Controller 类在 DCCService 项目中,这将如何完成?哪个更好?

我想我在这里遗漏了一些相当基本的东西。感谢您的帮助或建议。如果我需要更清楚,请告诉我。

瑞恩·R.

【问题讨论】:

    标签: visual-studio-2008 wcf wcf-client


    【解决方案1】:

    轮询设备的代码在逻辑上是 WCF 服务的一部分,而不是宿主项目。代码是物理驻留在 WCF 服务项目还是 WCF 服务项目引用的类库中,是个人喜好。

    这就是我的做法。

    我有一个托管在 Windows 服务中的 WCF CollectionService。 CollectionService 项目显然有一个 CollectionService 类,它实现了启用 WCF 的 ICollectionService 接口,这是客户端与 CollectionService 交互的方式。

    在同一个项目中,我有一个 Collector 类,它有一个私有构造函数,防止在类范围之外创建该类的实例。该类有一个它维护的Collectors 的私有静态 列表。该类还有两个静态函数 - Start()Stop()

    当客户端想要启动 Collector 时,它会调用 CollectionService 的 Start() 操作。这个 CollectionService 依次调用静态 Collector.Start() 函数,该函数创建一个 Collector 实例并将其存储在 Collectors 的静态列表中。当客户端希望停止 Collector 时,它会调用 CollectionService 的 Stop() 操作,这将转换为对静态 Collector.Stop() 函数的调用,停止 Collector 并将其从列表中删除。

    Collector 被实例化时,它会启动一个新线程,开始收集数据并将其提供给感兴趣的各方。 新线程是关键。 否则,Collector 实例将简单地位于Collectors 列表中而不做任何事情。

    因为我在处理线程,显然我必须处理同步问题,比如同步访问Collectors 的静态列表。我不希望客户尝试启动Collector,而其他人试图将其关闭。

    简而言之就是这样。

    如果您还没有创建 Windows 服务,这里有两篇我写的 SO 帖子,提供了如何创建的分步说明。

    第一个链接基本上可以让您访问该服务;第二个展示了如何在不需要InstallUtil 的情况下安装/卸载它。

    我希望这会有所帮助。

    编辑

    如果只有一个Controller 可以运行,则可以简单地忽略后续启动Controller 的调用,可能会返回一条表明它已经在运行的消息。

    如果您希望多个客户端访问来自Controller 的数据,这非常简单。您只需要维护一个订阅者列表。 Controller 只是将数据发送给列表中的任何订阅者。

    WCF 中已经存在这样的发布-订阅框架。您可以在此处阅读详细信息:

    What You Need To Know About One-Way Calls, Callbacks, And Events

    您可以从 Juval Lowy 的网站IDesign.net 免费下载此框架。我正在使用这个概念向感兴趣的各方发送 CollectionService 事件的信号。我希望您可以使用相同的概念向多个客户提供数据。

    【讨论】:

    • 感谢您的精彩回答。一个重要的警告是控制器一次只能有一个活动连接。当第二个客户致电Start() 时,这将如何处理?或者在这种情况下一次只能有一个Collector。因此,一次只有一个客户端可以从Controller 获取数据? 我的一个想法:要拥有多个客户端,是否可以在 Host 启动时运行 Collector,并让客户端使用 WCF 服务从该 Collector 获取数据?
    【解决方案2】:

    在我看来,您需要一个 Windows 服务来托管 (1) 轮询硬件控制器的代码和 (2) WCF 服务主机。在这种情况下,最好将服务管道代码(即继承 ServiceBase 和 WCF 服务主机的类)保存在服务 exe 中,并将实际功能保存在类库中,您可以从服务 exe 中引用它。

    我这样做的方法是有一个后台组件来轮询硬件控制器并维护一个“当前状态”,该状态将存储在内存中(可能作为单例)或数据库中。然后编写 WCF 服务以在调用进入时查询当前状态。

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多