У меня есть служба SOAP 1.1, разработанная с использованием Spring Boot на Java, которая без проблем отвечает на любые мои запросы и доставляет действительный SOAP-ответ.
Теперь проблема заключается в том, как только я добавляю эту службув качестве ссылки на службу для любого проекта .NET / C # ссылка создается, и я могу отправлять запросы, но ответ (который определенно отправляется из моей SOAP-службы) не может быть отображен обратно, и объект в моем приложении .NET всегда равен нулю.
Я уже выяснил, в чем может быть проблема, но я не знаю точно, как (если это вообще возможно) изменить мой xsd / wsdl для правильной генерации всех источников.
Прежде всего, это мой .xsd из моего проекта Java Spring Boot для генерации WSDL и справочника по сервисам:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://atu.de/soaptransformer/base"
xmlns:tns="http://atu.de/soaptransformer/base"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
<xs:complexType name="ArrayOfMessages">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="message" nillable="true"
type="tns:AppDataMessageData"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AppDataMessageData">
<xs:sequence>
<xs:element name="messageCode" type="xs:int"/>
<xs:element name="messageText" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataMessageData" nillable="true" type="tns:AppDataMessageData"/>
<xs:complexType name="AppDataHeaderData">
<xs:sequence>
<xs:element name="authorization" type="xs:string"/>
<xs:element name="branchNumber" type="xs:string"/>
<xs:element name="mainSystemOrderNumber" type="xs:string"/>
<xs:element name="callMode" type="xs:string"/>
<xs:element name="damageType" type="xs:string"/>
<xs:element name="misc1" type="xs:string"/>
<xs:element name="misc2" type="xs:string"/>
<xs:element name="countryRegionId" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataHeaderData" nillable="true" type="tns:AppDataHeaderData"/>
<xs:complexType name="ArrayOfPositions">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="position" nillable="true"
type="tns:AppDataPositionData"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AppDataPositionData">
<xs:sequence>
<xs:element name="inventTransId" type="xs:string"/>
<xs:element name="positionNumber" type="xs:int"/>
<xs:element name="itemId" type="xs:string"/>
<xs:element name="itemType" type="xs:string"/>
<xs:element name="articleDescription" type="xs:string"/>
<xs:element name="deleteFlag" type="xs:boolean"/>
<xs:element name="itemPosType" type="xs:string"/>
<xs:element name="itemParentId" type="xs:string"/>
<xs:element name="installDuration" type="xs:double"/>
<xs:element name="misc" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
<xs:element name="quantity" type="xs:double"/>
<xs:element name="salesPrice" type="xs:double"/>
<xs:element name="lineDiscAuto" type="xs:double"/>
<xs:element name="lineDiscMan" type="xs:double"/>
<xs:element name="lineDiscEmpl" type="xs:double"/>
<xs:element name="lineAmount" type="xs:double"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataPositionData" nillable="true" type="tns:AppDataPositionData"/>
<xs:complexType name="AppDataInsuranceData">
<xs:sequence>
<xs:element name="retention" type="xs:double"/>
<xs:element name="policyNumber" type="xs:string"/>
<xs:element name="lossNumber" type="xs:string"/>
<xs:element name="directPlacing" type="xs:boolean"/>
<xs:element name="inputTaxDeduction" type="xs:boolean"/>
<xs:element name="lossDate" type="xs:string"/>
<xs:element name="arranger" type="xs:string"/>
<xs:element name="retentionRenounceWorkshop" type="xs:double"/>
<xs:element name="retentionRenounceInsurance" type="xs:double"/>
<xs:element name="transmitted" type="xs:boolean"/>
<xs:element name="automatedCDVProvided" type="xs:boolean"/>
<xs:element name="insuranceDamageCauseDesc" type="xs:string"/>
<xs:element name="insuranceDamageDesc" type="xs:string"/>
<xs:element name="costCovered" type="xs:boolean"/>
<xs:element name="costCoveringCheckState" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
<xs:element name="directPayer" type="xs:boolean"/>
<xs:element name="insuranceDamageType" type="xs:string"/>
<xs:element name="insuranceDebitorNumber" type="xs:int"/>
<xs:element name="insuranceName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataInsuranceData" nillable="true" type="tns:AppDataInsuranceData"/>
<xs:complexType name="AppDataCustomerData">
<xs:sequence>
<xs:element name="custAccount" type="xs:string"/>
<xs:element name="custAccountDBM" type="xs:string"/>
<xs:element name="authorizationId" type="xs:string"/>
<xs:element name="noticeId" type="xs:string"/>
<xs:element name="flagDNEPost" type="xs:boolean"/>
<xs:element name="flagDNEElec" type="xs:boolean"/>
<xs:element name="custGroup" type="xs:string"/>
<xs:element name="approvalNo" type="xs:string"/>
<xs:element name="leasingNo" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
<xs:element name="salutation" type="xs:string"/>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
<xs:element name="company" type="xs:string"/>
<xs:element name="zipCode" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="addressHouseNumber" type="xs:string"/>
<xs:element name="addressHouseNumberAdd" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="mobil" type="xs:string"/>
<xs:element name="telefax" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataCustomerData" nillable="true" type="tns:AppDataCustomerData"/>
<xs:complexType name="AppDataVehicleData">
<xs:sequence>
<xs:element name="vehicleId" type="xs:string"/>
<xs:element name="licenseNumber" type="xs:string"/>
<xs:element name="vin" type="xs:string"/>
<xs:element name="atuKtypNr" type="xs:int"/>
<xs:element name="tecDocKtypNr" type="xs:int"/>
<xs:element name="kba1" type="xs:string"/>
<xs:element name="kba2" type="xs:string"/>
<xs:element name="kba3" type="xs:string"/>
<xs:element name="kba32" type="xs:string"/>
<xs:element name="natCode" type="xs:string"/>
<xs:element name="mileage" type="xs:int"/>
<xs:element name="registrationDate" type="xs:string"/>
<xs:element name="categoryId" type="xs:string"/>
<xs:element name="manufacturerName" type="xs:string"/>
<xs:element name="modelName" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataVehicleData" nillable="true" type="tns:AppDataVehicleData"/>
<xs:complexType name="AppDataMiscData">
<xs:sequence>
<xs:element name="EmplName" type="xs:string"/>
<xs:element name="messages" type="tns:ArrayOfMessages"/>
<xs:element name="IntDummy_1" type="xs:int"/>
<xs:element name="IntDummy_2" type="xs:int"/>
<xs:element name="IntDummy_3" type="xs:int"/>
<xs:element name="IntDummy_4" type="xs:int"/>
<xs:element name="IntDummy_5" type="xs:int"/>
<xs:element name="DoubleDummy_1" type="xs:double"/>
<xs:element name="DoubleDummy_2" type="xs:double"/>
<xs:element name="DoubleDummy_3" type="xs:double"/>
<xs:element name="DoubleDummy_4" type="xs:double"/>
<xs:element name="DoubleDummy_5" type="xs:double"/>
<xs:element name="StringDummy_1" type="xs:string"/>
<xs:element name="StringDummy_2" type="xs:string"/>
<xs:element name="StringDummy_3" type="xs:string"/>
<xs:element name="StringDummy_4" type="xs:string"/>
<xs:element name="StringDummy_5" type="xs:string"/>
<xs:element name="BooleanDummy_1" type="xs:boolean"/>
<xs:element name="BooleanDummy_2" type="xs:boolean"/>
<xs:element name="BooleanDummy_3" type="xs:boolean"/>
<xs:element name="BooleanDummy_4" type="xs:boolean"/>
<xs:element name="BooleanDummy_5" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataMiscData" nillable="true" type="tns:AppDataMiscData"/>
<xs:complexType name="ArrayOfAdditionals">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="additional" nillable="true"
type="tns:AppDataAdditionalData"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AppDataAdditionalData">
<xs:sequence>
<xs:element name="data1" type="xs:string"/>
<xs:element name="data2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="AppDataAdditionalData" nillable="true" type="tns:AppDataAdditionalData"/>
<xs:complexType name="AppDataDataRequest">
<xs:sequence>
<xs:element name="headerData" type="tns:AppDataHeaderData"/>
<xs:element name="positions" type="tns:ArrayOfPositions"/>
<xs:element name="insuranceData" type="tns:AppDataInsuranceData"/>
<xs:element name="customerData" type="tns:AppDataCustomerData"/>
<xs:element name="vehicleData" type="tns:AppDataVehicleData"/>
<xs:element name="miscData" type="tns:AppDataMiscData" form="unqualified"/>
<xs:element name="additionals" type="tns:ArrayOfAdditionals" form="unqualified"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="processingRequest">
<xs:sequence>
<xs:element name="AppDataDataRequest" type="tns:AppDataDataRequest"/>
</xs:sequence>
</xs:complexType>
<xs:element name="processingRequest" nillable="true" type="tns:processingRequest"/>
<xs:complexType name="AppDataDataResult">
<xs:sequence>
<xs:element name="headerData" type="tns:AppDataHeaderData"/>
<xs:element name="positions" type="tns:ArrayOfPositions"/>
<xs:element name="insuranceData" type="tns:AppDataInsuranceData"/>
<xs:element name="customerData" type="tns:AppDataCustomerData"/>
<xs:element name="vehicleData" type="tns:AppDataVehicleData"/>
<xs:element name="miscData" type="tns:AppDataMiscData"/>
<xs:element name="additionals" type="tns:ArrayOfAdditionals"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="processingResponse">
<xs:sequence>
<xs:element name="AppDataDataResult" type="tns:AppDataDataResult"/>
</xs:sequence>
</xs:complexType>
<xs:element name="processingResponse" nillable="true" type="tns:AppDataDataResult"/>
</xs:schema>
Вот код из сгенерированного справочника по сервисам из Visual Studio в проекте C #:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://atu.de/soaptransformer/base/processing", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true)]
public processingResponse processing([System.Xml.Serialization.XmlElementAttribute(Namespace="http://atu.de/soaptransformer/base", IsNullable=true)] processingRequest processingRequest) {
object[] results = this.Invoke("processing", new object[] {
processingRequest});
return ((processingResponse)(results[0]));
}
Я узнал, изменил ли я следующую строку
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true)]
и добавил "Form = System.Xml.Schema.XmlSchemaForm.Unqualified ":
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true, Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
Ответ правильно сопоставлен с моим Объектом, и в данный момент он работает без проблем.
Проблема в том, что я хочу изменить свой .xsd для правильной генерации этих источников с самого начала - я уже пытался добавить Form = Unqualified к элементу «AppDataDataResult» внутри complexType «processingResponse», но он не работает.
Добавление этого свойства непосредственно к элементу processingResponse не работает, либо потому, что это невозможно, поскольку один уровень ниже определения / тега схемы.
Я не нашел какого-либо конкретного решения для этогопроблема, потому что она кажется очень специфичной для Spring Boot Framework Java и генерации wsdl.
Я надеюсь, что кто-то может мне помочь с этой проблемой, потому что она не кажется большой (только для нее)«атрибут, который нужно добавить во время генерации источников), но я не могу найти решение этой проблемы.Заранее спасибо за помощь!