我有一個需要Web客戶端(ASP.NET MVC)上的實時更新的需求。我可以解決的唯一方法是實施技術(ServerPush/Reverse-AJAX)技術。WCF彗星實現
該場景是: 用戶A在不同的網站客戶端保存消息。然後,用戶B將自動獲取由用戶「A」在不同瀏覽器中進行的更新。
我真正完成這個架構的解決方案: ASP.NET MVC - 確實在WCF一個jQuery AJAX(POST)請求(長池)。 WCF - 在間隔1秒的時間內對數據庫(SQL Server)進行一些輪詢。如果新數據已添加到數據庫中,則輪詢與客戶端上返回的數據中斷。
WCF COMET方法僞代碼:
private Message[] GetMessages(System.Guid userID)
{
var messages = new List<Message>();
var found = false;
/* declare connection, command */
while (!found)
{
try
{
/* open connection - connection.Open(); */
/* do some database access here */
/* close connection - connection.Close(); */
/* if returned record > 0 then process the Message and save to messages variable */
/* sleep thread : System.Threading.Thread.Sleep(1000); */
found = true;
}
finally
{
/* for sure, incase of exception */
/* close connection - connection.Close(); */
}
}
return messages.ToArray();
}
我的關心和問題是:是它做在WCF輪詢技術的最佳方法(1秒間隔)?
原因:我最大限度地使用了數據庫連接池,並且我期待這個技術沒有問題。
注意:這是一個多線程實現,使用WCF給定屬性如下。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall), ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = true)]
順便說一下,你有自己託管的WCF服務或IIS託管的嗎?如果後者出現問題,則IIS的併發線程級別非常低,大約15個左右,之後它將對請求排隊,這在pub/sub方案中不起作用。 – Anders
是的,我是一個自託管的WCF服務(IIS託管)。我試圖通過在SQL Server 2008中啓用Service Broker服務來使用SqlDependecy對象,它工作正常,並且觸發數據更改返回給客戶端。但是,DBA告訴我不要使用它,因爲線程和開放式服務監聽器有一些限制(最大限制未定義)。你有什麼想法分享如何實施適當的COMET服務? – Mike
你能分享一下WCF COMET實現的確切方式嗎?謝謝! – Mike