.NET导入WSDL服务引用返回Null,SoapUI可正常获取值
解决Visual Studio导入WSDL后服务调用返回Null(因响应含转义<字符)的问题
先确认转义类型
用抓包工具(比如Fiddler)查看服务返回的实际XML:如果是<被转成了&lt;(双重转义),C#默认序列化器会因无法识别合法XML结构解析失败返回Null,而SoapUI会自动处理这类转义并显示为<;如果只是正常转义的<,问题大概率出在WSDL的类型定义上。调整服务引用的序列化配置
右键项目里的服务引用 → 「配置服务引用」,将序列化模式改为XmlSerializer(默认是DataContractSerializer,对XML格式严格性要求更高)。如果仍无效,取消勾选「重用引用程序集中的类型」,避免外部类型干扰解析。手动修改生成的实体类代码
找到服务引用生成的Reference.cs文件(右键服务引用 → 「查看代码」),定位到返回Null的对应字段,给它添加[XmlElement(IsNullable = true)]特性,或把字段类型强制改成string,让序列化器将转义内容当作纯文本处理:[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] public string TargetField { get; set; }自定义序列化逻辑兜底
若上述方法无效,给对应实体类实现IXmlSerializable接口,手动读取响应内容:public class ResponseEntity : IXmlSerializable { public string Content { get; set; } public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(System.Xml.XmlReader reader) { reader.ReadStartElement(); // 直接读取原始文本,保留所有转义字符 Content = reader.ReadContentAsString(); reader.ReadEndElement(); } public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteString(Content); } }临时修复:拦截并修正响应报文
实现客户端消息拦截器,自动修正响应中的双重转义问题:public class EscapeFixInspector : IClientMessageInspector { public void AfterReceiveReply(ref Message reply, object correlationState) { var xmlContent = reply.ToString(); // 把双重转义的<和>还原成正常转义 xmlContent = xmlContent.Replace("&lt;", "<").Replace("&gt;", ">"); var newReply = Message.CreateMessage(reply.Version, reply.Action, XmlReader.Create(new StringReader(xmlContent))); newReply.Properties.CopyProperties(reply.Properties); reply = newReply; } public object BeforeSendRequest(ref Message request, IClientChannel channel) { return null; } } // 注册拦截器到客户端 var client = new YourServiceClient(); client.Endpoint.Behaviors.Add(new EndpointBehavior(new EscapeFixInspector()));
内容的提问来源于stack exchange,提问作者Georginio
相关产品推荐
相关产品推荐

