Asp.net Soap头异常意外元素
我们在ASP.Net产品中使用的一个Web服务发布了一个新的WSDL。但他们声称功能没有改变。 因为我遇到了一个异常,所以我尝试比较新旧WSDL。 我看到一些格式“语言”的差异。 这是表示Soap WSDL的两种不同方式, 或者这是两种不同版本的模式编写?我在网上找不到这方面的任何提及 我还是.Net世界的新手! 我是否应该继续在.Net产品中简单地重新创建引用并使用它 无论如何,这是个例外Asp.net Soap头异常意外元素,asp.net,web-services,soap,xsd,wsdl,Asp.net,Web Services,Soap,Xsd,Wsdl,我们在ASP.Net产品中使用的一个Web服务发布了一个新的WSDL。但他们声称功能没有改变。 因为我遇到了一个异常,所以我尝试比较新旧WSDL。 我看到一些格式“语言”的差异。 这是表示Soap WSDL的两种不同方式, 或者这是两种不同版本的模式编写?我在网上找不到这方面的任何提及 我还是.Net世界的新手! 我是否应该继续在.Net产品中简单地重新创建引用并使用它 无论如何,这是个例外 Error Type: System.Web.Services.Protocols.SoapHeader
Error Type: System.Web.Services.Protocols.SoapHeaderException
Error Message: Unexpected element {urn:SOAP_PmtPortal_Server}newOrder found. Expected {urn:ServerPmtPortal}newOrderRequest.
Error Source: System.Web.Services
Stack Trace: at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
我包括旧的和新的WSDL(除去一个操作以外的所有操作)
旧WSDL(有关新WSDL,请参见本节后面的内容)
新的WSDL是这样的
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="urn:ServerPmtPortal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="ServerPmtPortalService"
targetNamespace="urn:ServerPmtPortal">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ServerPmtPortal" version="1.0">
<xs:element name="newOrderRequest">
<xs:complexType>
<xs:all>
<xs:element name="appID" type="xs:string"/>
<xs:element name="merID" type="xs:string"/>
<xs:element name="redURL" type="xs:string"/>
<xs:element minOccurs="0" name="uname" type="xs:string"/>
<xs:element minOccurs="0" name="cmt" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="newOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="tranID" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="newOrder">
<wsdl:part element="tns:newOrderRequest" name="body">
</wsdl:part>
</wsdl:message>
<wsdl:message name="newOrderResponse">
<wsdl:part element="tns:newOrderResponse" name="body">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ServerPmtPortalPort">
<wsdl:operation name="newOrder">
<wsdl:input message="tns:newOrder" name="newOrder">
</wsdl:input>
<wsdl:output message="tns:newOrderResponse" name="newOrderResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServerPmtPortalServiceSoapBinding" type="tns:ServerPmtPortalPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="newOrder">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="newOrder">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="newOrderResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServerPmtPortalService">
<wsdl:port binding="tns:ServerPmtPortalServiceSoapBinding" name="ServerPmtPortalPort">
<soap:address location="https://stage.service.com/Pmt-proxy/services/v1/paynow"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
我不知道如何理解WSDL定义中的差异。 从生成客户机或存根代码的方式来看,旧WSDL的方法newOrder采用了5个单独的参数:appID、merID、redURL、uname、cmt。 新的WSDL方法只接受一个参数,即newOrderRequest,它依次包含5个属性。
我生成了新的存根并使用它,并告诉相关人员,如果不更改代码,我们无法指向新的WSDL。从外观上看,WSDL是不同的。但最好的检查方法是下载soapui之类的工具来模拟服务。使用soapui,您可以看到旧的和新的请求和响应布局,并对它们进行比较。
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="urn:ServerPmtPortal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="ServerPmtPortalService"
targetNamespace="urn:ServerPmtPortal">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ServerPmtPortal" version="1.0">
<xs:element name="newOrderRequest">
<xs:complexType>
<xs:all>
<xs:element name="appID" type="xs:string"/>
<xs:element name="merID" type="xs:string"/>
<xs:element name="redURL" type="xs:string"/>
<xs:element minOccurs="0" name="uname" type="xs:string"/>
<xs:element minOccurs="0" name="cmt" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="newOrderResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="tranID" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="newOrder">
<wsdl:part element="tns:newOrderRequest" name="body">
</wsdl:part>
</wsdl:message>
<wsdl:message name="newOrderResponse">
<wsdl:part element="tns:newOrderResponse" name="body">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ServerPmtPortalPort">
<wsdl:operation name="newOrder">
<wsdl:input message="tns:newOrder" name="newOrder">
</wsdl:input>
<wsdl:output message="tns:newOrderResponse" name="newOrderResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServerPmtPortalServiceSoapBinding" type="tns:ServerPmtPortalPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="newOrder">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="newOrder">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="newOrderResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServerPmtPortalService">
<wsdl:port binding="tns:ServerPmtPortalServiceSoapBinding" name="ServerPmtPortalPort">
<soap:address location="https://stage.service.com/Pmt-proxy/services/v1/paynow"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>