2009-09-02 89 views
5

我遇到一些重大問題上試圖消耗使用ASP.NET我的PHP SOAP Web服務PHP的SOAP的WebService。有問題的web服務是基於PHP的SOAP擴展,由下面的WSDL descibed:消費與ASP.NET

<?xml version="1.0" encoding="UTF-8" ?> 
<definitions name="MyServices" 
    targetNamespace="http://mydomain.com/api/soap/v11/services" 
    xmlns:tns="http://mydomain.com/api/soap/v11/services" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd1="http://mydomain.com/api/soap/v11/services" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns="http://schemas.xmlsoap.org/wsdl/"> 

<types> 
    <schema targetNamespace="http://mydomain.com/api/soap/v11/services" xmlns="http://www.w3.org/2001/XMLSchema"> 
     <complexType name="ServiceType"> 
      <all> 
       <element name="id" type="xsd:int" minOccurs="1" maxOccurs="1" /> 
       <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" /> 
       <element name="cost" type="xsd:float" minOccurs="1" maxOccurs="1" /> 
      </all> 
     </complexType> 
     <complexType name="ArrayOfServiceType"> 
      <all> 
       <element name="Services" type="ServiceType" minOccurs="0" maxOccurs="unbounded" /> 
      </all> 
     </complexType> 
    </schema> 
</types> 


<message name="getServicesRequest"> 
    <part name="postcode" type="xsd:string" /> 
</message> 

<message name="getServicesResponse"> 
    <part name="Result" type="xsd1:ArrayOfServiceType"/> 
</message> 

<portType name="ServicesPortType"> 
    <operation name="getServices"> 
    <input message="tns:getServicesRequest"/> 
    <output message="tns:getServicesResponse"/> 
    </operation> 
</portType> 

<binding name="ServicesBinding" type="tns:ServicesPortType"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="getServices"> 
    <soap:operation soapAction="http://mydomain.com/api/soap/v11/services/getServices" /> 
    <input> 
     <soap:body use="encoded" namespace="urn:my:services" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
    </input> 
    <output> 
     <soap:body use="encoded" namespace="urn:my:services" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
    </output> 
    </operation> 
</binding> 

<service name="MyServices"> 
    <port name="ServicesPort" binding="tns:ServicesBinding"> 
    <soap:address location="http://mydomain.com/api/soap/v11/services"/> 
    </port> 
</service> 
</definitions> 

我可以成功地產生了這個WSDL在Visual Studio中的代理類,但在試圖調用該getServices方法我帶有一個例外:

System.Web.Services.Protocols.SoapHeaderException:過程「串」不存在

在SOAP服務器端檢查的原始數據後,我的PHP SOAP客戶端發出請求像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <postcode xsi:type="xsd:string">ln4 4nq</postcode> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

儘管淨代理類是這樣做的:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="http://mydomain.com/api/soap/v11/services" 
    xmlns:types="http://mydomain.com/api/soap/v11/services/encodedTypes" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <xsd:string xsi:type="xsd:string">LN4 4NQ</xsd:string> 
    </soap:Body> 
</soap:Envelope> 

我只能假設在郵政編碼參數被髮送的方式不同的是問題所在,但主要是PHP開發人員我不知道這裏發生了什麼。我有一種感覺,我在WSDL中錯過了一些至關重要的東西,因爲我已經看到了無數的「使用.Net來使用PHP SOAP WebServices」的例子,這些例子似乎暗示它「正常工作」。

任何建議到哪裏我在這裏輸了球將不勝感激。我現在用了差不多一整天的時間提前這現在;-)

感謝,

傑米

+0

這很容易滑倒......在SOAP :-D – andychase 2012-09-21 18:46:22

回答

1

對不起做出回答,而不是由我評論沒有足夠的聲譽那可是...

你應該嘗試用SOAP-UI,以測試你的Web服務(他們有一個免費版本),所以你就會知道,如果這個問題是客戶端或服務器端。

0

的WSDL有錯誤,因此最有可能的代理類是腐敗。請求也是如此。
除非您使用良好的WSDL編輯器,否則WSDL非常複雜。我會建議Eclipse WSDL編輯器(http://wiki.eclipse.org/index.php/Introduction_to_the_WSDL_Editor

(1)'all'模型組中元素的{max發生}必須爲0或1.元素'Services'的值'-1'無效。
(2)錯誤解決組件 '的ServiceType'。據檢測「服務類型」爲命名空間「http://www.w3.org/2001/XMLSchema」,但是從這個命名空間的部件無法從架構文檔的可參考