2011-05-26 108 views
0

我在執行我的WCF消息攔截器時遇到了一些問題。基本上我正在訪問正文內容,並在節點集上執行xslt變換以對它進行排序。如何編輯WCF消息 - WCF消息攔截器

我測試過XSLT樣式表,它的工作沒有問題。我將轉換結果寫入MemoryStream對象,然後嘗試從流內容重新創建消息。

我考察使用一個StreamReader的所產生的數據流或加載到一個XmlDocument,我可以看到的XML它包含它從XSLT我預期的結果變換。當我嘗試重新消息

我的問題occures!我創建一個基於流的XmlReader並將其用作Message.CreateMessage(.....)的身體源代碼;

我不明白爲什麼我突然失去了「正確」的內容流中時,我可以檢驗一下,看看一對夫婦較早的語句。

非常感謝!下面的方法

全碼:

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 

     MessageBuffer msgbuf = request.CreateBufferedCopy(int.MaxValue); 
     Message tmpMessage = msgbuf.CreateMessage(); 
     XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents(); 

     MemoryStream ms = new MemoryStream(); 
     _compiledTransform.Transform(xdr,null,ms); 

     ms.Position = 0; 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ms); 

     MemoryStream newStream = new MemoryStream(); 
     xmlDoc.Save(newStream); 
     newStream.Position = 0; 

     //To debug contents of the stream 
     StreamReader sr = new StreamReader(newStream); 
     var temp = sr.ReadToEnd(); 
     //At this point the XSLT tranforms has resulted in the fragment we want so all good! 


     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ConformanceLevel = ConformanceLevel.Fragment; 
     newStream.Position = 0; 
     XmlReader reader = XmlReader.Create(newStream,settings); 
     reader.MoveToContent(); 

     //Reader seems to have lost the correct fragment!!! At least returned message does not contain correct fragment. 
     Message newMessage = Message.CreateMessage(request.Version, null, reader); 
     newMessage.Properties.CopyProperties(request.Properties); 
     request = newMessage; 

     return request; 
    } 
+0

你可以發表一個原始和轉換的消息的例子嗎? – carlosfigueira 2011-05-27 03:20:37

回答

0

我認爲你的代碼工程Griff。我只是將它插入現有的IDispatchMessageInspector實現中,並生成了一個很好的(已轉換的)消息。因此我懷疑你的問題在別處。

你是如何建立的「失去」正確的內容是什麼?無論檢查轉換後的消息是否在轉換之前都要讀取消息?

+0

嗨伊恩, 要回答你的問題我使用了SoapUI發送SOAP請求,WCF服務,並捕捉響應! 也只是在測試內置的VStudio WCF測試客戶端,我沒有得到預期的結果。 我可能會更厚臉皮,並要求你對我插入代碼的Inspector版本進行ping命令嗎?我只是想知道我錯過了我的設置上的一些愚蠢的東西! 謝謝 – Griff 2011-05-26 16:18:36

+0

我不確定SoapUI如何捕獲_transformed_請求。 SoapUI肯定會發送原始請求,並在到達終點之前由您的IDispatchMessageInspector進行轉換。然後將響應發送回SoapUI。但是UI沒有提供_transformed_請求的可見性(除非,或許你直接發送請求作爲響應)。那麼你怎麼知道轉型的結果正在失去呢? – 2011-05-27 07:37:14

+0

代碼實際上工作正常,正如Ian所建議的,他在線下親切地審查了我的代碼,並在他的幫助下確定我的測試工具存在故障。 – Griff 2011-05-27 11:46:37

0

除非你試圖correlate state with the BeforeSendReply method那麼你應該返回的null而不是要求參考。

+0

是的同意,但這實際上不關係我想解決的問題!感謝您的輸入!我已經提出了你的建議編輯! – Griff 2011-05-26 14:35:43