在 WCF 中实现客户端回调功能

本文关键字:回调 功能 客户端 实现 WCF | 更新日期: 2023-09-27 18:35:56

我正在处理的项目是一个客户端-服务器应用程序,所有服务都是用 WCF 编写的,客户端是用 WPF 编写的。在某些情况下,服务器需要将信息推送到客户端。我最初是关于使用 WCF 双工服务的,但在网上做了一些研究后,我认为很多人出于多种原因避免使用它。

我想到的下一件事是让客户端创建一个主机连接,以便服务器可以使用它来对客户端进行服务调用。然而,问题是应用程序是通过互联网部署的,因此这种方法需要配置防火墙以允许传入流量,并且由于大多数用户是普通用户,因此可能还需要配置路由器以允许端口转发,这对用户来说又是一个麻烦。

我的第三个选择是在客户端中生成一个后台线程,该线程调用服务器上的GetNotifications()方法。然后,服务器端的此方法会阻塞,直到创建实际通知,然后通知线程(也许使用AutoResetEvent对象?)并将信息发送到客户端。这个想法是这样的:

客户

private void InitializeListener()
{
    Task.Factory.StartNew(() =>
    {
        while (true)
        {
            var notification = server.GetNotifications();
            // Display the notification.
        }
    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}

服务器

public NotificationObject GetNotifications()
{
    while (true)
    {
         notificationEvent.WaitOne();
         return someNotificationObject;
    }
}
private void NotificationCreated()
{
    // Inform the client of this event.
    notificationEvent.Set();
}

在这种情况下,NotificationCreated() 是当服务器需要向客户端发送信息时调用的回调方法。

您如何看待这种方法?这是否可扩展?

在 WCF 中实现客户端回调功能

对于每个客户端,您将在服务器上保存一个线程。如果您有几百个客户端,并且服务器无论如何都不会使用内存,那可能没问题。如果可以有更多的客户端,或者您不希望每个客户端刻录 1MB 的堆栈,则应进行一些更改:

  1. 使用异步 WCF 操作方法。它们允许您在方法等待时取消阻止请求线程。
  2. 将事件模型更改为异步一次。 SemaphoreSlim具有异步支持。您也可以使用 TaskCompletionSource .

这样,您可以扩展到许多连接。