2012-08-28 117 views
0

我有一個web服務需要使用jabber-net對象向客戶端發送XMPP消息。 (用於處理打印:當Web服務需要打印某些內容時,我將XMPP消息發送到在插入打印機的特定機器上運行的Windows窗體客戶端,並使用打印作業類型和URL,以及然後客戶端下載數據並將其發送到打印機,該通信通道也將用於其他POS功能,如打開至抽屜,與芯片和引腳設備通話等,因此打印替代品將不會有幫助。ASP.NET Webgarden共享靜態對象

我有一個靜態對象,其中包含jabber-net對象的實例,它登錄到XMPP服務器,然後可用於發送消息。

這工作得很好單線程。當我將Web服務轉換爲Web服務器以便它可以在多個線程上工作時,似乎每個線程都有它自己的jabber-net對象實例,所以它們都試圖在XMPP服務器上登錄曾經是同一個用戶,這意味着他們不斷被踢出去。

問題:有沒有什麼辦法可以在Web花園的所有線程之間共享一個活動對象(可能處理事件,而不是序列化對象,而不僅僅是數據),如果是的話,最好的方法是什麼?

回答

0

Web花園基本上是微型網站農場,應該這樣對待 - 尋找將涉及網絡農場的解決方案,這些解決方案將適用於您的情況。

我被會議和網絡花園發現了,最終我轉向了一個進程外會話提供者(我使用了一個基於memcached的提供者,但是SQL Server提供者已經工作了)。你可以做類似的事情,並有一個eac線程可以請求對象的共享提供者。

雖然這不會解決您的事件問題 - 我懷疑這樣可以解決問題,您可能必須切換到消息系統(例如msmq),並且所有消息都由單個進程處理。

+0

問題是,基於XMPP的方法*是我發送消息的方式。 MSMQ不會有太大的幫助,因爲「無法從沒有直接連接的計算機上的隊列中讀取消息。」 我想我可以用每個線程分別用一個唯一的名字簽名到XMPP服務器,儘管找出哪些名字可以自由登錄會很有趣......也許如果我深入瞭解jabber-net,我會工作了解如何使用相同的名稱和不同的資源對其進行簽名。 –

+0

好吧,這將作爲答案,因爲添加行 _JabberClient.Resource =「myserver」+ Thread.CurrentThread.ManagedThreadId.ToString(); 已排序的所有內容:所有線程可以一次快樂地登錄,他們都能夠發送消息,並且任何消息/在線狀態通知都會被所有人收到。 –