You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET导入WSDL服务引用返回Null,SoapUI可正常获取值

解决Visual Studio导入WSDL后服务调用返回Null(因响应含转义<字符)的问题
  • 先确认转义类型
    用抓包工具(比如Fiddler)查看服务返回的实际XML:如果是<被转成了&amp;lt;(双重转义),C#默认序列化器会因无法识别合法XML结构解析失败返回Null,而SoapUI会自动处理这类转义并显示为<;如果只是正常转义的&lt;,问题大概率出在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();
            // 把双重转义的&lt;和&gt;还原成正常转义
            xmlContent = xmlContent.Replace("&amp;lt;", "&lt;").Replace("&amp;gt;", "&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:10:41