2012-08-15 41 views
4

所有對System.ServiceModel.Channels.Message方法只允許您閱讀郵件正文一次,並且如果該消息已被讀取後調用失敗,出現異常。 msdn文檔確認只能讀取消息正文。但是,如果您在已閱讀的消息上致電ToString(),您似乎會收回整個肥皂信封,身體和所有信封。WCF Message.ToString()方法如何工作?

所以在我的情況下,它似乎是可以訪問即使它已經閱讀如果只有方法將允許它的身體。

有什麼我在這裏失蹤?在某些情況下,是否使用ToString()作爲解決方案來使主體不可靠?

在我的情況,我工作了一段WCF操作的一些錯誤日誌和OperationContext.RequestContext.RequestMessage的獲取原始消息。我使用ToString()來記錄消息,因爲這是我可以找到的唯一方法來允許我記錄消息正文。

回答

8

的ToString 可能打印郵件正文,但這並不能保證。 Message對象有很多種類(這是一個抽象類)。其中一些緩衝全身,而另一些只有一個只有前瞻性的讀者。當調用ToString時,緩衝消息的消息實現可能會在中寫入主體,這就是你所看到的。但這不能保證所有的消息類型。在很多情況下,當調用ToString時,身體簡寫爲「... stream ...」。

+0

感謝卡洛斯......我會投你一票,但沒有足夠的聲望:) – TCC 2012-08-22 16:19:05

0

您應該創建郵件副本然後read。例如:

using (MessageBuffer messageBuffer = message.CreateBufferedCopy(Int32.MaxValue)) 
{ 
    Message restoredMessage = messageBuffer.CreateMessage(); 
    message = messageBuffer.CreateMessage(); 
    return MessageToString(ref restoredMessage); 
} 

RequestContext.RequestMessage是一個方法調用不存在,所以ToString將無法​​正常工作,其他方式RequestMessage.ToString()將返回消息內容串

+0

消息讀取後不允許'CreateBufferedCopy'。我已經在服務操作中,因此該消息已被讀取。我認爲調用'CreateBufferedCopy'的正確時間是在消息檢查器中。但我並不是真的想要實現一個消息檢查器,以防我稍後記錄消息。在這種情況下,我正在尋找一種方法來恢復郵件,只有在操作過程中遇到錯誤時,才能爲錯誤日誌提供一些上下文。 – TCC 2012-08-15 20:34:02

+0

對於我來說,訊息檢查員是一個不錯的選擇。這裏是示例http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1d9d73d0-240c-46a8-853f-d7c3dfc85c6c/。 – GSerjo 2012-08-15 20:39:34

+0

這當然是一個選項......然後'ToString'是一個選項,除非有人知道反對它的原因,這就是我所要求的。 – TCC 2012-08-15 20:41:41

2

只是想分享一下,我已經成功地使用了message.toString方法,目的是保留從byte[]派生的base64編碼的字符串,這在創建消息緩衝區時會丟失(緩衝區是生成副本的唯一方法的原始消息,所以它是我的代碼所必需的)。在創建緩衝區,使用它來製作XML並編輯XML之後,我使用從toString方法保存的字符串恢復了base64字符串。我不會推薦這樣做,但它確實是這種情況下唯一的選擇,我知道它會在我的特定代碼中工作。也就是說,我通常認爲這應該是最後的選擇。