0
.NET SOAP 서버을 사용하는 응용 프로그램을 빌드하고 있습니다. 클라이언트는 CodeIgniter에 내장되어 있으며 표준 PHP SOAP 라이브러리을 사용했습니다.SOAP .NET 서버, PHP 클라이언트, xml 오류
new SoapClient('urlToWSDL',array('soap_version'=>SOAP_1_2, 'exceptions'=>true, 'trace'=>1, 'cache_wsdl'=>WSDL_CACHE_NONE));
<s:element name="evaluateOperator">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="comment" type="tns:comments"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="comments">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="s:long"/>
<s:element minOccurs="1" maxOccurs="1" name="added_by" type="s:long"/>
<s:element minOccurs="1" maxOccurs="1" name="posted" type="s:dateTime"/>
<s:element minOccurs="0" maxOccurs="1" name="text" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="parcelID" type="s:long"/>
<s:element minOccurs="1" maxOccurs="1" name="evalTimeliness" type="s:float"/>
<s:element minOccurs="1" maxOccurs="1" name="evalQoS" type="s:float"/>
</s:sequence>
</s:complexType>
이 방법을 PHP로 호출하면 오류가 발생합니다.
$comment = array(
'id' => null,
'added_by' => 2,
'posted' => date('d-m-Y'),
'text' => "test",
'parcelID' => 1,
'evalTimeliness' => 2,
'evalQoS' => 3
);
$this->client->evaluateOperator(array('comment'=>$comment));
SoapFault exception: [soap:Sender] System.Web.Services.Protocols.SoapException: Server was unable to read request. ---> System.InvalidOperationException: There is an error in XML document (2, 153). ---> System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Xml.XmlConvert.ToInt64(String s)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read9_comments(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read93_evaluateOperator()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer136.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
--- End of inner exception stack trace ---
at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
서버에 보내는 XML이 올바르게 보입니다.
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://inetpost.pl">
<env:Body>
<ns1:evaluateOperator>
<ns1:comment>
<ns1:id/>
<ns1:added_by>2</ns1:added_by>
<ns1:posted>08-02-2011</ns1:posted>
<ns1:text>idsuhffeiuhfadsihdfsiu</ns1:text>
<ns1:parcelID>1</ns1:parcelID>
<ns1:evalTimeliness>2</ns1:evalTimeliness>
<ns1:evalQoS>3</ns1:evalQoS>
</ns1:comment>
</ns1:evaluateOperator>
</env:Body>
</env:Envelope>
왜 그런지 궁금합니다. 도움이 될 것입니다.
id 값으로 설정해 보았습니다. 같은 것 – Dawid