2011-05-26 191 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