2012-04-23 59 views
3

我在消息檢查器中檢查響應正文中包含以下代碼。我知道WCF消息只能被讀取一次,所以我先創建一個副本。但是使用下面的代碼,我仍然得到錯誤「這條消息無法支持操作,因爲它已被讀取。」...我錯過了什麼嗎?創建WCF消息的緩衝副本

 MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue); 
     Message copy = buffer.CreateMessage(); 
     message = copy; 

     XmlDictionaryReader bodyReader = copy.GetReaderAtBodyContents(); 
     bodyReader.ReadStartElement("Binary"); 
     byte[] bodyBytes = bodyReader.ReadContentAsBase64(); 
     string messageBody = Encoding.UTF8.GetString(bodyBytes); 

     return messageBody; 

此外,我不覺得在那裏使用Int23.MaxValue舒適。什麼是合理的尺寸?

回答

9

試試這個代碼:

MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue); 
    message = buffer.CreateMessage(); 

    var copy = buffer.CreateMessage(); 
    XmlDictionaryReader bodyReader = copy.GetReaderAtBodyContents(); 
    bodyReader.ReadStartElement("Binary"); 
    byte[] bodyBytes = bodyReader.ReadContentAsBase64(); 
    string messageBody = Encoding.UTF8.GetString(bodyBytes); 

    return messageBody; 
+0

謝謝!有效!你能解釋一下這個區別嗎? – Laguna 2012-04-23 17:14:50

+1

'message'變量通過引用傳遞到您的代碼中,幷包含WCF將使用的消息。它不能處於「已讀」狀態,以便WCF使用有效。但是,您可以多次調用'buffer.CreateMessage()'來創建WCF正在處理的實際消息的克隆。如果您想在現有消息中注入某些內容,則可以從舊消息中創建一條新消息,並將修改後的消息傳回給WCF。 – 2012-04-23 17:22:08