C# SOAP Webservice 方法返回 null

Posted

技术标签:

【中文标题】C# SOAP Webservice 方法返回 null【英文标题】:C# SOAP Webservice method returns null 【发布时间】:2020-10-31 01:57:14 【问题描述】:

我正在从 C# 项目的 SOAP Web 服务调用一个方法,即使我可以在程序级别看到带有预期数据和格式(使用 fiddler)的响应,该方法仍返回 null。难道是函数没有正确解析响应吗?

函数以标准方式调用(selectedPLCInfo 最终为空)

LanDB.DeviceBasicInfo selectedPLCInfo = client.getDeviceBasicInfo(plcHostname);

这是应用程序发送的请求:

POST xxx/soap/soap.fcgi?v=6 HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: xxx
Content-Length: 1439
Expect: 100-continue
Accept-Encoding: gzip, deflate

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <Auth xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <token xmlns="http://schemas.datacontract.org/2004/07/TIA_Portal_VPG_Manager">token</token>
    </Auth>
</s:Header>
<s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <q1:getDeviceBasicInfo xmlns:q1="urn:NetworkService"><DeviceName xsi:type="xsd:string">CFP-RE12-VLHCPFM2</DeviceName></q1:getDeviceBasicInfo></s:Body>
</s:Envelope>

这是回应:

HTTP/1.1 200 OK
Date: Fri, 10 Jul 2020 10:15:17 GMT
Server: Apache
SOAPServer: SOAP060::Lite/Perl/0.60
Content-Length: 2912
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:types="urn:NetworkDataTypes" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>
<namesp3945:getDeviceBasicInfoResponse xmlns:namesp3945="urn:NetworkService">
<DeviceBasicInfo xsi:type="types:DeviceInfo">

(... a ton of expected data here)

</DeviceBasicInfo>
</namesp3945:getDeviceBasicInfoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

任何想法为什么会发生这种情况?

谢谢!

【问题讨论】:

你得到了很好的结果 a 200 OK。所以问题出在 XML 序列化(反序列化)中。与 c# 类、合同名称和 xml 数据匹配有一些不一致的地方。通常问题出在名称空间上。 xml 文件名根元素是 Envelope,因此合约名称也应该是 Envelope。您还应该有用于 Envelope、Body 和 DeviceBasicInfo 的 c# 类。 奇怪的是,并非所有方法都有相同的问题,只有其中一些。无论如何,我设法通过将 Web 服务添加为 Web 引用而不是服务引用来解决它(这种方式一切正常)。去图吧! 【参考方案1】:

解决方案是将服务添加为 Web 参考而不是服务参考。更多信息在这里:

http://webservices20.blogspot.com/2008/10/interoperability-gotcha-visual-studio.html

【讨论】:

以上是关于C# SOAP Webservice 方法返回 null的主要内容,如果未能解决你的问题,请参考以下文章

c# webService 自定义soap头??急急急

C#实现SOAP调用WebService

C#使用SOAP获取webservice实例解析

如何使用C#创建WebService

php调用c# webservice方法

Android中的网络编程