2012-02-09 6 views
2

PHP 클라이언트를 C#/WCF 웹 서비스에 작성하고 있습니다. 일부 호출의 매개 변수는 PHP로 인스턴스화하고 SOAP 형식의 페이로드로 HTTP POST를 통해 웹 서비스로 전달하는 비즈니스 클래스의 인스턴스로 구성됩니다. 이러한 클래스 중 일부의 생성자에는 하나 이상의 선택적 매개 변수가 있으며 그 중 일부는 Int32 유형입니다.PHP SoapClient 호출의 null 값

PHP에서이 매개 변수를 선택적으로 설정 한 다음 빈 문자열 (물론 더 구체적으로 빈 노드로 아래 예에서 <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; 
     } 
    } 
} 

해당 개체가 웹 서비스에 도달하면

는, C 번호는 The value '' cannot be parsed as the type 'Int32' 말, 그것을 deserilize 수 없습니다.

기본값을 0으로 설정하면 모든 것이 정상적으로 작동합니다 (오류 메시지가 표시되면 예상대로). 문제는 webservice가 제공되지 않을 경우 해당 값을 기본값으로 설정하는 비즈니스 로직이 있으며 클라이언트에서 해당 로직을 재현하지 않겠다는 것입니다.

빈 노드를 보내지 않고 PHP의 SoapClient가 null 속성을 보내지 않도록 지시 할 수있는 방법이 있습니까?

답변

2

더 자세히 분석 한 결과,이 문제는 서비스의 WSDL 정의에있는 것으로 확인되었습니다. 일부 비즈니스 로직의 선택적 속성은 WSDL에서 nillable로 표시되지 않았으며,이 경우 SoapClient (완벽하게 올바르게)는 빈 마디.

WSDL에서 속성을 nillable로 제대로 정의하면 해당 속성이 null로 설정된 경우 노드는 nil="true"으로 표시되고 끝점에 빈 문자열로 표시되지 않습니다.

관련 문제