使用ASP.NET的PHP SOAP WebService

时间:2009-09-02 13:46:16

标签: .net php asp.net soap wsdl

我在使用ASP.NET尝试使用PHP SOAP Web服务时遇到了一些重大问题。有问题的Web服务基于PHP SOAP扩展,并由以下WSDL描述:

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

我可以在Visual Studio中从此WSDL成功生成代理类,但在尝试调用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>

.Net代理类正在执行此操作:

<?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 Web服务的例子,这似乎表明它“只是有效”。

关于我在这里滑倒的任何建议都将非常感激。我现在已经花了将近一整天的时间; - )

提前致谢,

杰米

2 个答案:

答案 0 :(得分:1)

很抱歉,我没有足够的声誉来回答而不是发表评论......

您应该尝试使用SOAP-UI测试您的Web服务(它们有免费版本),因此您将知道问题是客户端还是服务器端。

答案 1 :(得分:0)

WSDL有错误,因此很可能代理类已损坏。请求也是如此。
除非你使用一个好的WSDL编辑器,否则WSDL非常复杂。我想建议Eclipse WSDL编辑器(http://wiki.eclipse.org/index.php/Introduction_to_the_WSDL_Editor

(1)'all'模型组中元素的{max occurrence}必须为0或1.元素'Services'的值'-1'无效。
(2)解析组件'ServiceType'时出错。检测到'ServiceType'位于命名空间“http://www.w3.org/2001/XMLSchema”中,但此命名空间中的组件无法从架构文档中引用