簡體   English   中英

在WCF中實現客戶端回調功能

[英]Implementing client callback functionality in WCF

我正在處理的項目是一個客戶端-服務器應用程序,所有服務均以WCF編寫,而客戶端則以WPF編寫。 在某些情況下,服務器需要將信息推送到客戶端。 我最初雖然使用WCF Duplex Services,但是在網上進行了一些研究之后,我發現很多人由於許多原因而避免使用它。

我想考慮的下一件事是讓客戶端創建主機連接,以便服務器可以使用該主機連接來對客戶端進行服務調用。 但是,問題在於該應用程序已部署在Internet上,因此該方法需要將防火牆配置為允許傳入流量,並且由於大多數用戶是常規用戶,因此可能還需要配置路由器以允許端口轉發,這又是給用戶帶來麻煩。

我的第三個選擇是在客戶端中產生一個后台線程,該線程調用服務器上的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()是當服務器需要向客戶端發送信息時調用的回調方法。

您如何看待這種方法? 這是完全可擴展的嗎?

對於每個客戶端,您將在服務器上保留一個線程。 如果您有幾百個客戶端,並且服務器仍然不使用內存,那可能很好。 如果可以有更多客戶端,或者您不希望每個客戶端刻錄1MB的堆棧,則應進行一些更改:

  1. 使用異步WCF操作方法。 它們使您可以在方法等待時取消阻塞請求線程。
  2. 一次將事件模型更改為異步。 SemaphoreSlim具有異步支持。 您也可以使用TaskCompletionSource

這樣,您可以擴展到許多連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM