Zeep客户端抛出服务没有操作错误

问题描述

我正在使用zeep调用SOAP Web服务。即使该方法存在于WSDL中,它也会引发错误

client = Client(self.const.soap_url)
client.service.getPlansDetails(id)

我收到此错误

AttributeError: Service has no operation 'getPlansDetails'

以下是python -m zeep <wsd_url>

中的信息
Prefixes:
     xsd: http://www.w3.org/2001/XMLSchema
     ns0: http://tempuri.org/Imports
     ns1: http://tempuri.org
     ns2: http://schemas.datacontract.org/2004/07/Dynamics.Ax.Application
     ns3: http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.Ax.Xpp
     ns4: http://schemas.microsoft.com/dynamics/2010/01/datacontracts
     ns5: http://schemas.microsoft.com/2003/10/Serialization/Arrays
     ns6: http://schemas.microsoft.com/dynamics/2008/01/documents/Fault
     ns7: http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.AX.Framework.Services
     ns8: http://schemas.microsoft.com/2003/10/Serialization/

Global elements:
     ns2:LFCPaymentPlanDetailsContract(ns2:LFCPaymentPlanDetailsContract)
     ns7:ArrayOfInfologMessage(ns7:ArrayOfInfologMessage)
     ns7:InfologMessage(ns7:InfologMessage)
     ns7:InfologMessageType(ns7:InfologMessageType)
     ns3:XppObjectBase(ns3:XppObjectBase)
     ns5:ArrayOfkeyvalueOfstringstring(ns5:ArrayOfkeyvalueOfstringstring)
     ns8:QName(xsd:QName)
     ns8:anyType(None)
     ns8:anyURI(xsd:anyURI)
     ns8:base64Binary(xsd:base64Binary)
     ns8:boolean(xsd:boolean)
     ns8:byte(xsd:byte)
     ns8:char(ns8:char)
     ns8:dateTime(xsd:dateTime)
     ns8:decimal(xsd:decimal)
     ns8:double(xsd:double)
     ns8:duration(ns8:duration)
     ns8:float(xsd:float)
     ns8:guid(ns8:guid)
     ns8:int(xsd:int)
     ns8:long(xsd:long)
     ns8:short(xsd:short)
     ns8:string(xsd:string)
     ns8:unsignedByte(xsd:unsignedByte)
     ns8:unsignedInt(xsd:unsignedInt)
     ns8:unsignedLong(xsd:unsignedLong)
     ns8:unsignedShort(xsd:unsignedShort)
     ns6:aifFault(ns6:aifFault)
     ns6:ArrayOfFaultMessage(ns6:ArrayOfFaultMessage)
     ns6:ArrayOfFaultMessageList(ns6:ArrayOfFaultMessageList)
     ns6:FaultMessage(ns6:FaultMessage)
     ns6:FaultMessageList(ns6:FaultMessageList)
     ns4:CallContext(ns4:CallContext)
     ns1:LFCPaymentPlanDetailsServicesGetPlansDetailsRequest(_crmno: xsd:string)
     ns1:LFCPaymentPlanDetailsServicesGetPlansDetailsResponse(response: ns2:LFCPaymentPlanDetailsContract)
     

Global types:
     xsd:anyType
     ns2:LFCPaymentPlanDetailsContract(Amount: xsd:decimal,CRMNumber: xsd:string,CustomerName: xsd:string,CustomerRequestedType: xsd:string,ErrorMessage: xsd:string,OrderId: xsd:long,PlanType: xsd:string)
     ns7:ArrayOfInfologMessage(InfologMessage: ns7:InfologMessage[])
     ns7:InfologMessage(InfologMessageType: ns7:InfologMessageType,Message: xsd:string)
     ns7:InfologMessageType
     ns3:XppObjectBase()
     ns5:ArrayOfkeyvalueOfstringstring(keyvalueOfstringstring: {Key: xsd:string,Value: xsd:string}[])
     ns8:char
     ns8:duration
     ns8:guid
     ns6:aifFault(CustomDetailXml: xsd:string,FaultMessageListArray: ns6:ArrayOfFaultMessageList,InfologMessageList: ns7:ArrayOfInfologMessage,StackTrace: xsd:string,XppExceptionType: xsd:int)
     ns6:ArrayOfFaultMessage(FaultMessage: ns6:FaultMessage[])
     ns6:ArrayOfFaultMessageList(FaultMessageList: ns6:FaultMessageList[])
     ns6:FaultMessage(Code: xsd:string,Message: xsd:string)
     ns6:FaultMessageList(Document: xsd:string,DocumentOperation: xsd:string,FaultMessageArray: ns6:ArrayOfFaultMessage,Field: xsd:string,Service: xsd:string,ServiceOperation: xsd:string,ServiceOperationParameter: xsd:string,XPath: xsd:string,XmlLine: xsd:string,XmlPosition: xsd:string)
     ns4:CallContext(Company: xsd:string,Language: xsd:string,logonAsUser: xsd:string,MessageId: xsd:string,PartitionKey: xsd:string,propertybag: ns5:ArrayOfkeyvalueOfstringstring)
     xsd:ENTITIES
     xsd:ENTITY
     xsd:ID
     xsd:IDREF
     xsd:IDREFS
     xsd:NCName
     xsd:NMTOKEN
     xsd:NMTOKENS
     xsd:NOTATION
     xsd:Name
     xsd:QName
     xsd:anySimpleType
     xsd:anyURI
     xsd:base64Binary
     xsd:boolean
     xsd:byte
     xsd:date
     xsd:dateTime
     xsd:decimal
     xsd:double
     xsd:duration
     xsd:float
     xsd:gDay
     xsd:gMonth
     xsd:gMonthDay
     xsd:gYear
     xsd:gYearMonth
     xsd:hexBinary
     xsd:int
     xsd:integer
     xsd:language
     xsd:long
     xsd:negativeInteger
     xsd:nonNegativeInteger
     xsd:nonPositiveInteger
     xsd:normalizedString
     xsd:positiveInteger
     xsd:short
     xsd:string
     xsd:time
     xsd:token
     xsd:unsignedByte
     xsd:unsignedInt
     xsd:unsignedLong
     xsd:unsignedShort

Bindings:
     Soap11Binding: {http://tempuri.org/}BasicHttpBinding_LFCPaymentPlanDetailsServices
     Soap11Binding: {http://tempuri.org/}serviceEndpoint

Service: RoutingService
     Port: serviceEndpoint (Soap11Binding: {http://tempuri.org/}serviceEndpoint)
         Operations:

     Port: BasicHttpBinding_LFCPaymentPlanDetailsServices (Soap11Binding: {http://tempuri.org/}BasicHttpBinding_LFCPaymentPlanDetailsServices)
         Operations:
            getPlansDetails(_crmno: xsd:string,_soapheaders={context: ns4:CallContext}) -> response: ns2:LFCPaymentPlanDetailsContract

解决方法

给出该错误的原因是因为默认情况下,zeep绑定到第一服务和第一端口。但是在您的情况下,您尝试从第二个端口调用方法。所以这应该工作:

client = Client(self.const.soap_url)
plan_client = client.bind('RoutingService','BasicHttpBinding_LFCPaymentPlanDetailsServices')

plan_client.service.getPlansDetails(id)

让我们知道它是否不起作用。