【问题标题】:How does the WCF service interact with my winform app?WCF 服务如何与我的 winform 应用程序交互?
【发布时间】:2011-11-16 12:08:40
【问题描述】:

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

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

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

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

我的问题是,第 4 步如何进行到第 5 步?具体来说,服务如何在收到帖子后将信息发送到winform应用程序。

更具体地说,一旦从网页接收到发帖,调用服务契约,服务发送和接收信息,服务如何利用回调通道将信息发送到到 winform 应用程序并相应地更新 UI?

【问题讨论】:

    标签: c# asp.net winforms wcf


    【解决方案1】:

    这个问题的答案取决于您的 WCF 服务是如何托管的,以及该服务最终会有多“大”(就同时客户端的数量而言)。

    • 最简单的方案是自托管 WCF 服务(意味着托管在 Windows 服务中或作为桌面应用程序,而不是在 IIS 中)。在这种情况下,您可以使用InstancePerSession 模式并让您的服务使用会话。在这种情况下,您将在客户端和服务类实例之间建立 1:1 的对应关系。当客户端连接时,检索回调引用并将其存储在服务类之外的静态列表中。当您需要向一个或多个客户端发送消息时,只需遍历(或在其中找到所需的客户端)您的列表并在回调合约上调用适当的函数
    • 如果您需要在 IIS 中托管您的服务,那么情况会更加棘手,因为您可能有多个进程托管您的服务,因此您的列表可能会变得支离破碎(或在应用程序池回收的情况下被炸毁) .在这种情况下,您必须使用服务外部的东西(也许是 MSMQ)来通知 其他 应用程序池进程需要发送消息。

    【讨论】:

    • 您好,再次感谢您的回复。关于您所说的部分,“当客户端连接时,检索回调引用并将其存储在服务类之外的静态列表中”我该怎么做?
    • 我仍然很不确定在我的服务从我的服务器收到帖子后会发生什么。服务如何在收到帖子后自动将帖子发送到我的winform?
    • edit :或者更确切地说,我如何在服务器调用发布方法后立即调用回调通道。 (在post方法的最后一行添加回调代码?)
    【解决方案2】:

    就双工连接而言,您实际上只能通过一个连接以两种方式进行通信,而不是通过服务的所有连接进行一些棘手的线程工作并关闭任何可扩展性的大门(或使用外部的东西)服务来处理发布/订阅)。

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

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

    【讨论】:

    • 我很好奇你所说的“棘手的线程”是什么意思。根据服务的托管方式(自托管与 iis),这可能像 static 回调合约连接列表一样简单,或者需要外部同步。无论哪种方式,我都不确定哪些特定的线程操作会发挥作用。
    • 在 WAS 中,您可以将主机指定为“网络花园”(即多个工作进程),或者如果您的服务需要扩展到多个服务器(“网络农场”),则显然是静态变量不管用。而不是使用static,您实际上可以将您的服务类标记为单个实例并只使用实例数据。但是我指的线程的东西是操作上下文的回调通道是在当前请求线程上维护的,而不是像全局字典那样。所以你必须实现这个字典,然后用它来查找特定的客户。
    • 另请注意,WSHTTPDualBinding 请求 2 个连接,因此它可能需要打开端口,这可能不适用于您的移动设备或其他设备,具体取决于它们的防火墙设置,这里有更多信息:@987654322 @ 我已经成功地为 Intranet 应用程序使用了双工绑定,但我认为在 Internet 上,当有其他库更适合您的需求时,这可能是个坏主意。如果您正在寻找自己实现的东西,您还可以签入 HTML 5 WebSockets。
    • “棘手的线程”我的意思是同步访问客户端列表并锁定一些通信,因为 WCF 是多线程的。
    • 对,这意味着将消息传递回客户端的方法取决于激活/托管机制(自托管与 WAS)。我同意你的观点,因为防火墙问题,WSHTTPDualBinding 几乎总是一个糟糕的选择。我的假设是这个用户的应用程序是一个 Intranet 应用程序,所以可以使用更合适的东西,比如NetTcpBinding。请注意,他希望在他的桌面应用程序和服务之间建立双工连接,而不是在移动设备和服务之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2013-11-28
    • 1970-01-01
    • 2012-11-15
    • 2017-11-01
    相关资源
    最近更新 更多