从网络应用程序

时间:2017-01-16 15:49:42

标签: c# php web-services webforms

好日子亲爱的朋友们。我想要从net winform应用程序调用使用 SoapServer 创建的PHP Web服务。 PHP方法接收xml字符串作为参数并返回json编码的数组:

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

这是wsdl包含在php web服务中我用来向visual studio添加 web reference

<?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>

正如我从fiddler所看到的,PHP接收参数并发回正确的json对象,但在网络代码中结果始终为null。网络代码是:

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

因此结果变量始终为null;我的猜测是wsdl绑定。我对这种情况进行了很多搜索。我已经意识到在没有 nusoap 的情况下使用带有net framework的php web服务的文档很少。感谢大家阅读这么长的问题。

1 个答案:

答案 0 :(得分:0)

因此,经过多次试验,现在一切正常。感谢Eclipse wsdl编辑器,继承了很棒的工具。 php wsdl应定义为:

<?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>

主要问题是incorect 架构命名空间 绑定机构命名空间缺失 。我希望这会对某人有所帮助。 附: Stackoverflow是搜索问题的最佳位置。