[英]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的堆棧,則應進行一些更改:
SemaphoreSlim
具有異步支持。 您也可以使用TaskCompletionSource
。 這樣,您可以擴展到許多連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.