2008-12-26 30 views
2

簡版: 當我使用ChannelFactory在使用雙工通信的客戶端上創建一個通道時,是否需要保持通道打開才能接收回調或者我可以調用ChannelFactory.Close()?雙工通信需要一個開放通道嗎?

長版本: 我正在開發我的第一個WCF服務,並創建了自己的ClientProxy類,它實現了幾個不同的服務並將其合併爲一個。我使用ChannelFactory來創建每個通道,並且我在網上的一般閱讀已經表明我應該緩存ChannelFactory,但我應該只在需要時打開和關閉實際通道。

因此,我打電話給ChannelFactory.Open打開一個通道並執行雙工操作(稍後調用回調的單向操作)。我是否應該在請求操作後調用ChannelFactory.Close來關閉此通道,如果我這樣做,我仍然會收到回調嗎?

基本測試似乎表明我會收到回調,如果我關閉連接,但我只是想確定。另外,這種對ChannelFactory進行緩存的方法是否正確?

感謝

回答

4

你應該保持客戶端代理開放,而你希望接收回調,完成後應關閉的通道。

下面是來自偉大的書編程WCF服務由朱瓦爾·洛報價(我建議你閱讀有關回調整章):

5.3.4。回調連接管理

回調機制不提供任何更高級的協議來管理服務和回調端點之間的連接。開發人員需要提供一些應用程序級別的協議或用於管理連接生命週期的一致模式。如前所述,如果客戶端通道仍處於打開狀態,則服務只能回撥給客戶端,通常通過不關閉代理來完成。保持代理服務器打開也會阻止回收對象被垃圾收集。如果服務在回調端點上維護引用,並且客戶端代理關閉或客戶端應用程序本身消失,則當服務調用回調時,它將從服務通道中獲取ObjectDisposedException。因此,當客戶不再希望收到回叫或客戶端應用程序關閉時,最好讓客戶通知服務。爲此,您可以將明確的Disconnect()方法添加到服務合約中。由於每個方法調用都帶有回調引用,因此在Disconnect()方法中,服務可以從其內部存儲中移除回調引用。