简体   繁体   中英

Calling php web service from net application

Good day dear friends. I'm tying to call PHP web service, created with SoapServer from net winform application. PHP method is recieving xml string as parameter and returning json encoded array:

    function getPolicy($contentsXml) {
        if ($everyting->isOK) {
            $resultArr = createResultArray();
        }else{
            // Process errors
        }
        $result = json_encode($resultArr);
        return $result;
    }

This is wsdl included in php web service i'm using to add web reference to visual studio:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions name="XmlImportClaimWSDL"
            targetNamespace="http://172.16.6.130/online/my.wsdl"
            xmlns:tns="http://172.16.6.130/online/my.wsdl"
            xmlns:xsd='http://www.w3.org/2001/XMLSchema'
            xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"  
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

<wsdl:types>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"  elementFormDefault="qualified" targetNamespace="http://tempuri.org/" >
         <element name="getPolicy">
             <complexType>
                <sequence>
                    <element minOccurs="0" maxOccurs="1" name="contentsXml" type="xsd:string" />
                 </sequence>
             </complexType>
          </element>
          <element name="getPolicyResponse">
             <complexType>
                <sequence>
                    <element minOccurs="0" maxOccurs="1" name="contentsXml" type="xsd:json" />
                </sequence>
             </complexType>
         </element>
    </xsd:schema>
 </wsdl:types>
  <wsdl:message name="getPolicyRequest">
    <wsdl:part name="requestParam" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="getPolicyResponse">
    <wsdl:part name="responseParam" type="xsd:string"/>
  </wsdl:message>
  <wsdl:portType name="ServerClaimSoapType">
    <wsdl:operation name="getPolicy">
      <wsdl:input message="tns:getPolicyRequest" />
      <wsdl:output message="tns:getPolicyResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServerClaimSoapBinding" type="tns:ServerClaimSoapType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
    <wsdl:operation name="getPolicy">
      <soap:operation soapAction="http://php-server-address/"/>
     <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
     <wsdl:output>
       <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ServerClaim">
    <wsdl:port name="ServerClaimSoap" binding="tns:ServerClaimSoapBinding">
      <soap:address  location="http://php-server-address/phpSoapService.php" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

As I can see from fiddler, PHP receives parameter and sends back correct json object, but in net code result is always null. Net code is:

PhpSoapObject client = new PhpSoapObject();
var result = client.getPolicy(PredifenedXmlString);

So the result variable is always null; My guess is wsdl binding. I've searched a lot about this situation. I've realized that using php web service with net framework without nusoap is very poorly documented. Thanks everyone for reading such a long question.

So after many trials everything is working now. Thanks to Eclipse wsdl editor, relay great tool. php wsdl should be defined as :

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions name="XmlImportClaimWSDL"
            targetNamespace="http://172.16.6.130/online/"
            xmlns:tns="http://172.16.6.130/online/"
            xmlns:xsd='http://www.w3.org/2001/XMLSchema'
            xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"  
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://172.16.6.130/online/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" >
  <xsd:element name="getPolicy">
             <xsd:complexType>
                <xsd:sequence>

                    <xsd:element minOccurs="0" maxOccurs="1" name="contentsXml" type="xsd:string" />
                 </xsd:sequence>
             </xsd:complexType>
          </xsd:element>
          <xsd:element name="getPolicyResponse">
             <xsd:complexType>
                <xsd:sequence>

                    <xsd:element minOccurs="0" maxOccurs="1" name="getPolicyResult" type="xsd:string" />
                </xsd:sequence>
             </xsd:complexType>
         </xsd:element>
    </xsd:schema>
 </wsdl:types>
  <wsdl:message name="getPolicyRequest">
    <wsdl:part name="requestParam" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="getPolicyResponse">
    <wsdl:part name="responseParam" type="xsd:string"/>
  </wsdl:message>
  <wsdl:portType name="ServerClaimSoapType">
    <wsdl:operation name="getPolicy">
      <wsdl:input message="tns:getPolicyRequest" />
      <wsdl:output message="tns:getPolicyResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServerClaimSoapBinding" type="tns:ServerClaimSoapType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
    <wsdl:operation name="getPolicy">
        <soap:operation soapAction="http://172.16.6.130/online/getPolicy" />
        <wsdl:input>
            <soap:body use="literal" namespace="http://172.16.6.130/online/"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" namespace="http://172.16.6.130/online/"/>
        </wsdl:output>
    </wsdl:operation>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ServerClaim">
    <wsdl:port name="ServerClaimSoap" binding="tns:ServerClaimSoapBinding">
      <soap:address  location="http://172.16.6.130/phpSoapService.php" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

The main problem was incorect schema namespace and binding body namespace missing . I hope this will help someone. PS Stackoverflow is the best place to search for your problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM