WCF返回自定义格式报文(兼容2.0)

在其他客户端如Java或.net2.0调用WCF的时候,会遇到一些麻烦;

WCF在返回数据时会默认以XML格式返回;

如下的XML字符串,在以字符串返回时会加到一个<String>节点里面

   1: <?xml version="1.0" encoding="utf-8" ?> 
   2:  <RespData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   3:   <RetCode>0</RetCode> 
   4:   <RetMsg>成功!</RetMsg> 
   5:   <SucList>All</SucList> 
   6:   <FailList>No</FailList> 
   7:   </RespData>
直接返回一个实体对象的时候,WCF会默认DataContractSerializer序例化为如下XML传输;在2.0里无法反序列为对象来处理;
   1: <?xml version="1.0" encoding="utf-8" ?> 
   2: <RespData xmlns="http://schemas.datacontract.org/2004/07/WCFSrv.Contracts" xmlns:i="  http://www.w3.org/2001/XMLSchema-instance">
   3:   <RetCode>0</RetCode> 
   4:   <RetMsg>成功!</RetMsg> 
   5:   <SucList>All</SucList> 
   6:   <FailList>No</FailList> 
   7:   </RespData>

在2.0里往往要以XmlSerializer进行反序列,这时候我们要得到标准的XML格式;

方法1:通过添加XmlSerializerFormat属性来返回

   1: [OperationContract, WebInvoke(Method = "*", UriTemplate = "SendXml")]
   2: [XmlSerializerFormat]
   3: CMailApiSrv.Model.RespData SendXml();

方法2:手动方式进行序列化直接返回Stream

   1: RespData resp = new RespData { RetCode = 0, RetMsg = "成功!", SucList = "All", FailList = "No" };
   2: MemoryStream ms ;
   3: XmlSerializer mySerializer = new System.Xml.Serialization.XmlSerializer(typeof(RespData));
   4: ms = new MemoryStream();
   5: mySerializer.Serialize(ms, resp);
   6: ms.Position = 0;
   7: WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml; charset=utf-8";
   8: return ms;

 

posted @ 2010-04-15 14:02  bino  阅读(973)  评论(3编辑  收藏  举报