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;