c# - 使用 C# 使用 web 服务 php

标签 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# 给我 Good Value (12708584)。

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

这是我的问题: 我怎样才能:
或者在不修改代理类的情况下将transactionCle设置为int类型?
或者让序列化给我带来好的值(value)?

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

最佳答案

在wsdl中的transactionCle元素中添加以下属性

minOccurs="1" maxOccurs="1" 

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

  1. 手动更改生成的代理(您已经提到您不会这样做)
  2. 要求 WS 所有者扩展生成的 wsdl。这将确保网络服务的 .net 兼容性
  3. 通过覆盖 SchemaImporterExtension 的方法创建您自己的代理生成器。在这里看看:http://msdn.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx .它还具有指向可下载示例的链接。

关于c# - 使用 C# 使用 web 服务 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826843/

相关文章:

java - 为什么在Scala中扩展Serializable?

C# 模型到 Javascript 对象 - 使用 knockout.js

c# - IComparable 和 IComparer 的区别

php - 颜色的 CSS 内联样式不适用于 Laravel 4.2 中电子邮件模板中的文本

c# - 如何在 ADO.NET Entity Framework 中使用存储过程

php mysql Paypal IPN mysql查询有问题

php - 在 PHP 中定义无符号 CHAR

c# - PHP 序列化的 C# 等价物是什么

c# - 无法通过反射更改只读字段

c# - ClickOnce 部署恐怖