2011-09-26 65 views
4

有許多類似的調用,也許並行,對一些Web服務,我想知道什麼是實現相關令牌機制的最佳方式。將相關令牌傳遞給WCF服務?

這個想法是從客戶端到服務器,有一個標識符記錄信息的能力,這個標識符有助於稍後獲取特定請求的日誌。

我想避免在每個操作中添加一個參數,因爲我認爲這是管道,而不是業務。 PS:我在我的解決方案中控制客戶端和服務器端。我可以改變任何需要的東西。我的服務使用.Net V4運行,我使用log4net創建日誌。我已經包裝log4net是一些實用的方法,我可以根據需要進行更改。

回答

3

那麼你只需要關於請求和響應的信息?如果您使用消息版本WS-Addressing,您應該自動擁有該消息,因爲每條消息都將包含其自動生成的標識(guid),並且每個響應也會包含該請求的標識。您可以通過OperationContext訪問這些標題:

服務器端:

UniqueId id = OperationContext.Current.IncomingMessageHeaders.MessageId; 

客戶端:

using (var scope = new OperationContextScope()) 
{ 
    // Do call to server and after that access headers 

    OperationContext context = OperationContext.Current; 
    UniqueId responseId = context.IncomingMessageHeaders.MessageId; 
    UniqueId requestId = context.IncomingMessageHeaders.RelatesTo; 
} 

要使用的WS-Addressing,你必須使用SOAP服務WsHttpBindingCustomBinding使用正確MessageVersionTextMessageEncodingBindingElement

如果您希望來自同一客戶端的所有請求具有相關性,則需要使用WCF會話並使用會話Id(OperationContext.Current.SessionId)。

+0

thx :)這正是我想要做的。一點封裝,我的日誌將與這個ID飼料。 –