You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Core调用SOAP服务报错无法读取响应体的排查求助

排查.NET SOAP客户端“无法读取响应体”异常

从你的描述来看,SOAP-UI能正常调用但.NET客户端抛出“无法读取响应体”,说明服务端返回是正常的,问题大概率出在客户端的XML反序列化逻辑和服务端实际返回的XML不匹配上。结合你给出的代码和预期响应格式,我整理了几个关键排查点:

1. 字段类型不匹配(最可能的原因)

预期响应里的permitSequencesequenceException是浮点格式的0.0,但自动生成的客户端代码里这两个字段被定义成了long(长整型):

private long permitSequenceField;
private long sequenceExceptionField;

当.NET尝试把字符串"0.0"反序列化为long类型时,会直接抛出类型转换错误,最终表现为“无法读取响应体”。

解决方法:

把这两个字段的类型修改为doubledecimal,同时更新对应的属性和Specified标记:

private double permitSequenceField;
private bool permitSequenceFieldSpecified;
private double sequenceExceptionField;
private bool sequenceExceptionFieldSpecified;

public double permitSequence {
    get { return this.permitSequenceField; }
    set { this.permitSequenceField = value; this.RaisePropertyChanged("permitSequence"); }
}

public double sequenceException {
    get { return this.sequenceExceptionField; }
    set { this.sequenceExceptionField = value; this.RaisePropertyChanged("sequenceException"); }
}

2. XML元素命名空间不匹配

预期响应里所有元素都带有tns:前缀,对应命名空间http://www.sampple.com/test,但你当前的客户端代码中,只有TestResponse类的XmlTypeAttribute指定了命名空间,而每个XmlElementAttribute都没有明确指定命名空间。这会导致反序列化时,.NET找不到对应命名空间下的元素,从而解析失败。

解决方法:

给每个XmlElementAttribute添加Namespace参数,确保和服务端返回的命名空间一致:

// TestResponse类中的字段
[System.Xml.Serialization.XmlElementAttribute(Order=0, Namespace="http://www.sampple.com/test")]
public TestResponseData data { ... }

[System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1, Namespace="http://www.sampple.com/test")]
public string statusCode { ... }

[System.Xml.Serialization.XmlElementAttribute("errors", Order=2, Namespace="http://www.sampple.com/test", IsNullable=true)]
public string[] errors { ... }

[System.Xml.Serialization.XmlElementAttribute(Order=3, Namespace="http://www.sampple.com/test")]
public string isSucceed { ... }

// TestResponseData类中的字段也要同步添加
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.sampple.com/test")]
public double permitSequence { ... }

3. 空元素errors的反序列化问题

预期响应里的<tns:errors/>是空元素,而客户端代码里定义的是string[]类型。如果服务端返回的是空元素而非标准的空数组XML结构(比如<tns:errors><tns:errors/></tns:errors>),可能导致反序列化失败。

解决方法:

errors字段的XmlElementAttribute添加IsNullable=true属性,允许该元素为空:

[System.Xml.Serialization.XmlElementAttribute("errors", Order=2, Namespace="http://www.sampple.com/test", IsNullable=true)]
public string[] errors { ... }

4. 额外排查:开启SOAP日志确认请求/响应

如果以上方法都没解决,建议开启SOAP日志,对比.NET客户端实际发送的请求和收到的响应,和SOAP-UI的请求/响应做对比,确认是否存在HTTP头、SOAP头不一致的情况。

在客户端的配置文件中添加以下日志配置:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging">
      <listeners>
        <add name="messages"
             type="System.Diagnostics.XmlWriterTraceListener"
             initializeData="soap_messages.log" />
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="System.ServiceModel.MessageLogging" value="Verbose" />
  </switches>
</system.diagnostics>

内容的提问来源于stack exchange,提问作者Shrembo

火山引擎 最新活动