2010-11-22 40 views
2

我需要在我的WCF服務中識別一個通道。WCF - 如何獲得一些頻道標識符?

一種方法是使用Session.SessionID,但我似乎無法獲得與會話一起工作的綁定,並且會話對於我試圖實現的東西似乎太多了。我只是想記下一個頻道的歷史記錄 - 正在調用什麼方法,並保留當前活動的「頻道ID」的散列。

我怎樣才能得到'頻道ID'之類的東西?我知道'頻道ID'不是明確存在的,但是有什麼解決方法?

+0

什麼是用例,你試圖用這個來達到什麼目的? – 2010-11-22 10:46:35

+0

正如我寫的 - 我試圖在某個歷史表中登錄一個基於頻道ID的歷史表,該頻道ID可以追蹤每個頻道在打開時調用哪些方法。此外,要有一種方法來跟蹤打開哪些渠道(這是一些業務邏輯)。 – veljkoz 2010-11-22 10:50:59

+0

如果我沒有弄錯作者有沒有SessionMode,所以他不能訪問OperationContext.Current來檢索會話回調或任何其他信息。 – 2010-11-22 10:57:40

回答

2

由於閒來無事開了竅,我「騙」這樣的:

在客戶端加入的MessageHeader:

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), "")); 

    string ret = cli.GetData(1); 
} 

在「名稱」標題的財產我有名字我想傳遞的頭文件中,我使用名稱空間作爲值的持有者(因爲我似乎無法得到頭的'值' - 它不會作爲屬性公開?!)。我每次創建服務實例時都會在客戶端執行此操作。

在服務我讀到這樣的標題:

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader"); 
string channelId = head.Namespace; 

這絕對是一個黑客,但我沒有時間來創造的東西更優雅,這讓我保持「通道ID」的方式,我可以控制它......它是一個醜陋的解決方案,我不喜歡它,所以每當有人找到更好的東西我會感激...

編輯:我試着用呼出/ IncomingMessageProperties但沒有按」噸似乎工作 - 這是無處找到服務器端...我可能錯過了一些...

+3

這是如何獲得標題值,而不通過命名空間攻擊它: Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader (「MyHeader」,「http:// example/my-header /」); – 2010-11-29 13:42:13

+0

@velijkov:我所有的聖誕節都來了。 TY。 – 2013-07-18 01:53:00

0

你試過string sessionID = OperationContext.Current.SessionId;

+0

如果沒有會話,這是不存在的,這是我的情況 - 我真的不想要會話。 – veljkoz 2010-11-22 10:45:24

+0

由於您不使用會話,因此您只需記錄回調地址,調用的接口和當前時間即可。那是你的追求? – 2010-11-22 10:51:57

+0

回撥地址可能就夠了,但我不確定它是否會有效識別用戶/頻道?如果用戶有兩個使用該服務的應用程序會怎麼樣?沒有辦法區分他們 – veljkoz 2010-11-22 11:01:14

0

聽起來像OperationContext.Current.Channel.GetHashCode()可能適合您的目的。

+0

這總是返回每個通道相同的哈希值。這導致我得出這樣的結論,即該頻道沒有任何區別於其他頻道的東西。 – veljkoz 2010-11-22 15:25:13

+0

...或者您的所有請求正在同一頻道上提供服務?你使用什麼綁定? – 2010-11-22 15:45:45

+0

basicHttpBinding - 但即使我重新啓動應用程序,通道散列保持不變。 – veljkoz 2010-11-22 16:33:52