C#发送SOAP消息失败:XML编码及xsi:type异常问题求助
问题排查与解决方案
核心问题定位
你的情况是EF15消息的XML内容被C#序列化为字符串类型(而非原生XML节点),导致SOAP请求中自动添加xsi:type="xsd:string",同时XML标签被转义成</>,服务器无法识别为XML节点,从而报错缺少字段。
具体解决步骤
1. 修正xsd2code生成的类定义
检查EF15AType类里承载XML内容的属性,若被定义为string类型,直接改为XmlElement类型——这是避免内容被转义的关键:
// 错误写法:string类型会触发自动转义 public string xmlMessage { get; set; } // 正确写法:用XmlElement让序列化器识别为XML节点 public XmlElement xmlMessage { get; set; }
如果xsd2code默认生成了string类型,要么手动修改属性,要么重新生成时在工具设置里指定对应XML节点类型。
2. 调整序列化特性配置
如果用XmlSerializer,给目标属性加[XmlElement]特性,明确标记为XML元素而非文本:
[XmlElement("xmlMessage")] public XmlElement xmlMessage { get; set; }
如果用DataContractSerializer,确保[DataMember]标记的属性类型是XmlElement,且命名空间与服务器要求完全匹配。
3. 手动构造SOAP请求(绕过自动序列化)
要是上面的方法没效果,直接拼原始SOAP字符串发送,彻底避免序列化转义问题:
// 完整构造SOAP请求,xmlMessage内部直接放EF15的XML内容 string soapRequest = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <YourRequest> <xmlMessage> <EF15A xmlns=""你的命名空间""> <!-- 这里直接写EF15的XML结构,不用转义 --> </EF15A> </xmlMessage> </YourRequest> </soap:Body> </soap:Envelope>"; // 用HttpClient发送请求 using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("SOAPAction", "你的SOAPAction地址"); var content = new StringContent(soapRequest, Encoding.UTF8, "text/xml"); var response = await client.PostAsync("服务器地址", content); // 处理响应逻辑 }
4. 核对命名空间一致性
确认EF15节点的命名空间和服务器要求完全一致,xsd2code生成类时可能自动添加额外命名空间前缀,要和对方成功的请求包对比,删除多余前缀或修正URI。
验证方法
改完后用Fiddler抓包,确认xmlMessage节点不再带xsi:type="xsd:string",内部XML标签也没有被转义,结构和对方成功的请求完全匹配即可。
内容的提问来源于stack exchange,提问作者rippergr
相关产品推荐
相关产品推荐

