2011-06-07 53 views
4

我在雙工通道上有一個WCF服務,帶有回調協議。當客戶端在服務上調用SubscribeMe()方法時,該服務通過將OperationContext.Current.GetCallbackChannel<T>()的結果存儲在列表中來跟蹤客戶端。該服務將定期ping這些回調通道以跟蹤其有效期,並將那些已關閉或超時的期限過期。獲取WCF中的回撥通道的IP地址

我的問題是這樣的:當遠程主機沒有主動向我的服務發出請求時,例如當我打電話給MyCallbackContract.Ping()時,如何獲取有關遠程主機的信息?

我試着將回調通道對象轉換爲IContextChannel並訪問IContextChannel::RemoteAddress屬性,但該屬性包含某種與回調通道上的實際遠程主機無關的名稱空間URI。

回答

5

未測試(將需要一段時間才能讓所有的配置設置!),但我認爲你在尋找這樣的事情:

OperationContext context = OperationContext.Current; 
MessageProperties messageProperties = context.IncomingMessageProperties; 
RemoteEndpointMessageProperty endpointProperty = 
       messageProperties[RemoteEndpointMessageProperty.Name] 
       as RemoteEndpointMessageProperty; 

var address = endpointProperty.Address; 
+0

所以,在我的情況,不應該有一個OperationContext.Current當我嘗試ping客戶端列表時。它被週期性地調用,並且沒有調用服務操作。如果解決方案是在訂閱時存儲遠程端點信息,那可能是合適的。 – 2011-06-07 07:56:44

+0

是的,在這種情況下,當客戶端連接時,使用上面的代碼(修改爲使用IncomingMessageProperties集合而不是傳出),您應該可以。對不起,這不是更有幫助,WCF是不是真的我的專業:) – Nathan 2011-06-07 08:02:16

+0

這是一個有效的解決方案。我只想知道我是否應該跟蹤這一點,或者如果我可以依靠WCF來做到這一點。這似乎是回調頻道應該能夠告訴我的那種東西。 – 2011-06-07 08:06:35