1

我在调用合作伙伴的 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。

4

0 回答 0