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

时间:2011-11-16 12:08:40

标签: c# asp.net winforms wcf

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

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

这基本上是我希望它的工作方式 他们这样做的方式是

  1. 在我的服务器上运行的WCF服务
  2. Windows窗体使用双面合同
  3. 连接到我的服务器的WCF服务
  4. 移动应用程序发布到网页
  5. 一旦网页收到帖子,asp.net将调用WCF服务
  6. WCF双工服务接收发布并将信息发送到winform app
  7. 我的winform应用程序即WCF客户端使用此新消息更新UI
  8. 我的问题是,第4步如何进入第5步?具体而言,服务如何在收到发布后将信息发送到winform应用程序。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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