调用n11 SOAP Web服务返回null/空值,Boomerang测试正常如何排查
排查步骤
验证请求响应实际报文
使用Fiddler等抓包工具分别抓取代码调用、Boomerang调用的完整请求与响应报文,对比两者差异:- 若代码请求的响应体本身就返回空/0值,说明请求参数结构、SOAP头、认证参数和Boomerang发送的内容不一致,重点核对
auth节点命名、参数大小写、pagingData节点结构是否匹配接口要求 - 若响应体有完整产品数据但代码解析为空,可确定是自动生成的客户端类反序列化失败问题,进入下一步排查
- 若代码请求的响应体本身就返回空/0值,说明请求参数结构、SOAP头、认证参数和Boomerang发送的内容不一致,重点核对
检查VS生成的服务引用类问题
VS自动生成SOAP客户端时经常出现序列化不匹配的情况,重点核对两点:- 打开自动生成的
GetProductListResponse、Product类定义,检查属性的[XmlElement]/[DataMember]注解的节点名、命名空间是否和实际返回的XML节点完全一致,大小写、命名空间前缀不匹配都会导致反序列化时属性被赋值为默认值(null、0) - 检查配置文件中服务绑定的配置:确认绑定类型(需用
basicHttpBinding匹配该SOAP1.1服务)、安全模式、消息版本设置是否正确,可尝试删除现有服务引用,重新通过添加服务引用 → 高级 → 添加Web引用(兼容.NET旧版SOAP服务)的路径重新生成客户端类测试
- 打开自动生成的
绕过自动生成客户端验证
可直接用HttpClient手动构造SOAP请求验证服务调用逻辑,示例代码如下:
public static async Task TestManualSoapRequest() { // 替换为实际的appKey、appSecret var soapEnvelope = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ws=""http://www.n11.com/ws/schemas""> <soapenv:Header/> <soapenv:Body> <ws:GetProductListRequest> <auth> <appKey>*****</appKey> <appSecret>*****</appSecret> </auth> <pagingData> <currentPage>0</currentPage> <pageSize>100</pageSize> </pagingData> </ws:GetProductListRequest> </soapenv:Body> </soapenv:Envelope>"; using var client = new HttpClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; client.DefaultRequestHeaders.Add("SOAPAction", ""); var content = new StringContent(soapEnvelope, System.Text.Encoding.UTF8, "text/xml"); var response = await client.PostAsync("https://api.n11.com/ws/ProductService.wsdl", content); var result = await response.Content.ReadAsStringAsync(); // 输出完整响应报文判断是否有正确返回 Console.WriteLine(result); }
若手动调用能拿到正确返回,即可确认问题出在VS自动生成的服务引用配置/序列化逻辑上,替换为手动构造请求或者修正自动生成类的序列化注解即可解决。
内容的提问来源于stack exchange,提问作者yusuf-2187
相关产品推荐
相关产品推荐

