WCF服务如何与我的winform应用程序交互?

我目前正在开发一个C#Windows窗体应用程序,我打算让它与服务器进行交互。 服务器将从我开发的移动应用程序接收发布,并且每当收到发布时,我的Windows窗体应用程序应该得到通知并给我通知。 为此,我打算为它使用WCF双工服务。

例如,我的移动应用程序发送一个post到我的服务器。 一旦我的服务器读取并接收新的post,该服务应该向我的winform应用程序发送一条消息,提醒我收到了一个post。 winform应用程序的UI应根据我想要更新的内容进行更新。 (例如添加新面板)

这基本上是我希望它能够工作的方式

  1. WCF服务在我的服务器上运行
  2. Windows窗体使用双工合同连接到我的服务器的WCF服务
  3. 移动应用程序发布到网页
  4. 一旦网页收到发布,asp.net将调用WCF服务
  5. WCF双工服务接收发布并将信息发送到winform应用程序
  6. 我的winform应用程序又名WCF客户端使用收到的这条新消息更新UI

我的问题是,第4步如何进入第5步? 具体而言,服务如何在收到发布后将信息发送到winform应用程序。

更具体地说,一旦从网页接收到发布,就调用服务合同并且服务发送和接收信息,服务如何利用回叫信道将信息发送到winform。应用程序并相应地更新UI?

这个问题的答案取决于您的WCF服务的托管方式以及服务最终的“大”(就同时客户端数量而言)。

  • 最简单的方案是自托管WCF服务(意味着托管在Windows服务中或作为桌面应用程序托管 – 而不是在IIS中)。 在这种情况下,您可以使用InstancePerSession模式并使您的服务使用会话。 在这种情况下,您将在客户端和服务类实例之间建立1:1的对应关系。 当客户端连接时,检索回调引用并将其存储在服务类之外的静态列表中。 当您需要向一个或多个客户端发送消息时,只需在列表中迭代(或找到所需的客户端)并在回调契约上调用相应的函数
  • 如果您需要在IIS中托管您的服务,那么情况就比较棘手,因为您可能有多个进程托管您的服务,因此您的列表可能会碎片化(或者在应用程序池回收时被吹走)。 在这种情况下,您将不得不使用服务外部的某些东西(可能是MSMQ)来通知其他应用程序池进程需要发送消息。

就双工连接而言,您实际上只能通过一个连接进行双向通信,而不是与服务的所有连接进行通信,而无需执行一些棘手的线程并关闭任何可伸缩性(或使用服务之外的东西来处理)发布/发布。

虽然一个解决方案可能比你想要做的更多,但它可能是SignalR 。 它允许单个客户端发出请求,然后您可以将该请求中的数据广播到其他客户端(或以其为目标)。 看看它的信息,它的唯一目的是在.NET中与多个客户端进行实时通信。

另外需要注意的是,您需要在WinForms中使用某种BackgroundWorker或其他东西作为监听线程,以便在后台操作运行时不会锁定UI。