我在调用合作伙伴的 Soap 网络服务时遇到问题。我必须用 C# 编写一个客户端来配合这个服务。我对网络服务比较陌生,如果我的问题很琐碎,我很抱歉,但是经过数小时的谷歌搜索后我找不到答案。
因此,服务(用 php 编写)接受键值对的参数。此结构(字段名称、类型)记录在手册中,但未出现在 wsdl 中(wsdl 中没有类型定义)
WSDL 的一部分:
<message name="Authenticate">
<part name="auth" type="xsd:anyType"/>
</message>
(例如“auth”是上面提到的数组类型,这是一个输入参数)
因此这些参数在 wsdl 中显示为“anyType”。当我生成代理类(使用添加 Web 引用选项)时,我注意到这些参数在自动生成的类中显示为“对象”。
我试图通过
- HashTable、Dictionary:这些是不可序列化的。
- 数组:不是键值对,不接受二维数组,一维是不够的(无论如何也不行)。
- 自定义类:我想这将是答案,但我有序列化问题。
我的自定义课程是:
[Serializable]
public class AuthClass
{
public string Username { get; set; }
public string AuthCode { get; set; }
}
所以我创建了一个“Authclass”实例,填充它,并尝试传递给服务。
Authclass a = new AuthClass();
(...fill....)
MyService s = new MyService(); //auto-generated proxy class
s.Authenticate(a); //auto-generated method
在运行时,我收到了序列化错误消息:类型 HelloWsdl.AuthClass 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。
我为 AuthClass、SoapInclude、XMLInclude、XmlRoot 等尝试了很多序列化属性,我也尝试过强制转换为“对象”,使用对象数组、列表等,但这些都没有解决问题。
所以我的问题是
- 如何将“php-style”数组参数传递给此 Web 服务?哪个是正确的方法?
- 在这种情况下是否可以使用生成的代理类,或者我必须选择另一种技术?在这种情况下,推荐哪种技术?
不幸的是,我无法更改 wsdl。