用C#消费一个webservice php

时间:2012-03-22 16:50:08

标签: c# php serialization soap web-reference

这是wsdl soap字段

<element name="transactionCle" nillable="true" type="xsd:int"/>  

当我在PHP中调用WS并使用__getLastResponse()

显示soap时

我得到的是transactionCle:

<transactionCle href="#id50"/>

这是该领域的参考:

<multiRef xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id50" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:int">12708584</multiRef>

我在使用php的Apache服务器提供的wsdl中添加了一个新的WebReference 生成的代理类为我提供了字段:

private System.Nullable<int> transactionCleField;

/// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public System.Nullable<int> transactionCle {
            get {
                return this.transactionCleField;
            }
            set {
                this.transactionCleField = value;
            }
        }

现在我的问题:

当我在php中使用WS时,transactionCle的值为12708584
当我在C#中使用WS时,transactionCle的值为null

如果我手动修改System.Nullable中的代理类到int 而现在C#给我的好价值(12708584)。

但是当我更新Web引用时,我必须再次修改代理类。

这是我的问题: 我怎么能:
或者将transactionCle设置为int类型而不修改代理类?
或者让序列化给我带来好的价值?

编辑:我无法修改WS php或wsdl

1 个答案:

答案 0 :(得分:1)

将以下属性添加到wsdl

中的transactionCle元素
minOccurs="1" maxOccurs="1" 

然后重新生成代理。如果它有帮助,那么你可以做三件事:

  1. 手动更改生成的代理(您已经提到过,不会这样做)
  2. 请求WS-owner扩展生成的wsdl。这将确保webservice的.net兼容性
  3. 通过覆盖SchemaImporterExtension的方法来创建自己的代理生成器。看看这里:http://msdn.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx。它还有一个可下载样本的链接。