2010-01-06 75 views
0

我正在开发一个.net应用程序,它使用了一个java web服务,我通过wsdl.exe工具创建了客户端,并且它的工作正常,网络方法之一服务,接收XML文档作为参数,并使用XmlTextWriter IM生成文档,但包括在XML文档内的特殊字符,例如当有问题IM:使用.net通过web服务发送特殊字符使用.net

文档IM产生看起来像这样:

<xml-parameter> 
    <some-field> this is text whit a (>) charatcer</some-field> 
</xml-parameter> 

使用fliddler检查生成的请求,我看到它的开始像这样逃脱:

&lt;xml-parameter&gt; 
    &lt;some-field&gt; this is a text whit a (&amp;gt;) character $lt;/some-field&gt; 
&lt;xml-parameter&gt; 

我可以看到被beign转义为“&安培; GT;“,而不是& GT;我都准备好使用实体而不是实际的性格丝毫没有运气提前 感谢=)试图

编辑: 这里的代码使用生成XML,基本上我。使用一个内存流和XmlTextWriter的生成XML,然后读取整个流,我通过生成的XML我的服务代理。

string query = "/AGS_Polizas/INBOUNDLINK/@SOURCEITEMREF = > * "; 

     MemoryStream stream = new MemoryStream(); 
     XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8); 
     writer.Formatting = Formatting.Indented; 
     writer.Indentation = 4; 
     writer.WriteStartDocument(true); 
     writer.WriteStartElement("RunQueryRequest"); 
     writer.WriteAttributeString("xmlns", "http://www.ibm.com/xmlns/db2/cm/beans/1.0/schema"); 
     writer.WriteAttributeString("maxResults", "0"); 
     writer.WriteAttributeString("version", "latest-version(.)"); 
     writer.WriteAttributeString("contentOption", "URL"); 
     writer.WriteAttributeString("retrieveOption", "ITEMTREE"); 

     writer.WriteStartElement("AuthenticationData"); 
     writer.WriteAttributeString("connectString", "SCHEMA=ICMADMIN"); 
     writer.WriteAttributeString("configString", ""); 

     writer.WriteStartElement("ServerDef"); 

     writer.WriteStartElement("ServerType"); 
     writer.WriteString("ICM"); 
     writer.WriteEndElement(); 

     writer.WriteStartElement("ServerName"); 
     writer.WriteString("icmnlsdb"); 
     writer.WriteEndElement(); 

     writer.WriteEndElement(); 


     writer.WriteStartElement("LoginData"); 

     writer.WriteStartElement("UserID"); 
     writer.WriteString("icmadmin"); 
     writer.WriteEndElement(); 

     writer.WriteStartElement("Password"); 
     writer.WriteString("Passw0rd"); 
     writer.WriteEndElement(); 

     writer.WriteEndElement();    
     writer.WriteEndElement(); 

     writer.WriteStartElement("QueryCriteria"); 
     writer.WriteStartElement("QueryString"); 
     writer.WriteString(query); 
     writer.WriteEndElement(); 

     writer.WriteEndElement(); 


     writer.WriteEndElement(); 

     writer.Flush(); 

     stream.Seek(0, SeekOrigin.Begin); 
     StreamReader reader = new StreamReader(stream); 
     string xml = reader.ReadToEnd(); 
     writer.Close(); 
     reader.Close(); 
+0

该字符正在被双重编码。你能向我们展示生成xml的代码吗? – nont 2010-01-06 18:37:49

+0

文本可以在某处进行双重编码吗?你是否使用writer.WriteString(“这是文本惠特(>)charatcer”);? – 2010-01-06 18:42:32

+0

嗯,即时通讯使用writer.WriteString其实是=/ – Harima555 2010-01-06 18:45:34

回答

0

你为什么产生手工请求XML并没有使用.NET的内置消费Web服务的方法?

看起来> *应该是双重转义的。 “>”标志需要被转义以包含在你的xml文档中。然后,您的整个XML文档需要被转义以适应XML Web服务请求。我不认为逃跑是一个问题。

+0

是的,不,信不信由你,我正在使用一个只有1个方法“processXMLRequest”的Web服务,所以我生成的代理只有一个方法“processXMLRequest”接收到一个xml字符串,所以尽管我没有创建SOAP请求,但我仍然需要创建Web服务可以理解的xml请求,相当冗余的web服务确实=( – Harima555 2010-01-06 22:05:22

+0

是的,那么>符号肯定是双重转义的。一旦适合xmlRequest,并且一次在SOAP请求中。 你在web方法里面的调试器中看到什么? – Yoenhofen 2010-01-06 22:41:47

+0

是的,就像你说的Yoenhofen,“>”在debuer i上被两次扫描当xml参数传递给代理时参见“>”,所以当代理转义整个SOAP请求时,“&”变成“&“=(,是否有任何方法可以让XmlTextWriter避免生成的XML? – Harima555 2010-01-06 22:49:04

0

好吧,我设法通过替换xmlTextWriter生成的xml上的“>”来解决此问题,并让服务代理转义整个SOAP请求。