2012-07-23 93 views
2

我正在實現WCF服務,該服務公開的方法的[OperationContract][XmlSerializerFormat]。我有時會收到其身體不是有效XML的請求。在這種情況下,我想記錄原始主體,所以我可以知道它爲什麼不構成有效的XML。然而,我無法從Message對象得到它,看到我的企圖(通過實現IDispatchMessageInspector接口):在反序列化之前獲取WCF消息主體

public object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     request.ToString(); // "... Error reading body: System.Xml.XmlException: The data at the root level is invalid. Line 1, position 1. ..." 
     request.WriteBody(...); // Serialization Exception, also in WriteMessage and other Write* methods 
     request.GetReaderAtBodyContents(...); // Same 
     HttpRequestMessageProperty httpRequest = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; // no body in httpRequest 
    } 

當手表來看,request.messageData似乎包含身體 - 但是這是一個私有成員。

如何獲得消息緩衝區而不嘗試反序列化它?

回答

1

你可能想看看執行Message Inspector

甲消息檢查是可以在 服務模型的客戶端運行時和調度運行時用於通過編程配置 或並且可以檢查和改變 之後它們被接收或它們被髮送之前的消息的擴展性對象。

的另一篇文章:

http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

UPDATE

已運行到這個問題,有些人似乎已經創建了一個Customer Message Encoder

編碼結合元件的消息序列化傳出消息和 其傳遞到運輸,或者接收從所述傳送一個 消息的序列化形式,並將其傳遞到協議層如果 存在,或到應用程序,如果不存在。

+0

我實現了IDispatchMessageInspector接口 - 現在修復了問題文本。我無法獲取原始郵件正文,以防它首先不是XML ... – user1545748 2012-07-23 12:55:11

+0

看起來您可能需要實施客戶郵件編碼器。我已經用一些額外的信息更新了我的答案。 – RQDQ 2012-07-23 15:28:51