2012-02-09 140 views
2

我正在为C#/ WCF Web服务编写PHP客户端。一些调用的参数由我在PHP中实例化的业务类实例组成,并通过SOAP格式的有效载荷中的HTTP POSTs传递给Web服务。其中一些类的构造函数具有一个或多个可选参数,其中一些参数的类型为Int32。PHP SoapClient中的空值调用

当我在PHP中将这些参数设置为可选参数,然后将实例发送到webservice时,它们将作为空字符串(具体来说,如下面示例中的空节点:<ns1:order />)进行传输。这发生在以下任一型号:

class ThingOne { 
    /** 
    * @var string $name 
    */ 

    /** 
    * @var int $order 
    */ 

    __construct($name, $order = null) { 
     $this->name = $name; 
     $this->order = $order; 
    } 
} 

class ThingOne { 
    /** 
    * @var string $name 
    */ 

    /** 
    * @var int $order 
    */ 

    __construct($name, $order = null) { 
     $this->name = $name; 
     if(isset($order) { 
      $this->order = $order; 
     } 
    } 
} 

一旦对象获取到web服务,C#不能deserilize了,他说The value '' cannot be parsed as the type 'Int32'

如果我默认值为0,那么一切正常(如我所料,给出错误信息)。问题在于,如果Web服务没有提供,那么Web服务具有业务逻辑来默认这些值,并且我不想在客户端中重现该逻辑。

有什么办法可以指示PHP的SoapClient不发送空属性,如果它们没有设置,而不是发送一个空节点?

回答

2

经过仔细分析后,我确定此问题出现在服务的WSDL定义中 - 某些业务逻辑可选属性在WSDL中未标记为可删除的,在这种情况下,SoapClient(完全正确)将空节点。

当WSDL将该属性正确定义为nillable时,如果该属性设置为null,则该节点将标记为nil="true",并且不会在端点上显示为空字符串。