2015-08-07 15 views
7

Wir haben ein Java-Backend, das Webdienste über WSDLs bedient. Es gibt einige Operationen, die xxWSResponse mit nur 1 Eigenschaft zurückgeben: ein Array.Visual Studio Service-Referenz WSDL-Rückgabetyp stimmt nicht überein

Wenn wir Service-Referenz in Visual Studio dem Webdienst hinzufügen, generiert VS den Code, um das Array direkt zurückzugeben, nicht die Antwort. Wenn in der Antwort oder mehreren Arrays mehr Eigenschaften vorhanden sind, funktioniert es wie gewünscht und gibt die Antwort zurück.

Betrieb Beispiel:

<wsdl:operation name="retrieveParameterTasksList"> 
    <wsdl:documentation> isIdempotent = NO -- TR:/retrieveParameterTasksList{retrieveParameterTasksList} -- EN:/retrieveParameterTasksList{retrieveParameterTasksList} </wsdl:documentation> 
    <wsdl:input message="tns:retrieveParameterTasksListRequestMsg" name="RetrieveParameterTasksListWSRequest" /> 
    <wsdl:output message="tns:retrieveParameterTasksListResponseMsg" name="RetrieveParameterTasksListWSResponse" /> 
    <wsdl:fault message="tns:SystemFault" name="SystemFault" /> 
    <wsdl:fault message="tns:BusinessFault" name="BusinessFault" /> 
</wsdl:operation> 

RetrieveParameterTasksListWSResponse:

<xsd:complexType name="RetrieveParameterTasksListWSResponse"> 
    <xsd:sequence> 
    <xsd:element form="qualified" name="taskListVOs" type="this:TasksListParameterDTO" minOccurs="0" maxOccurs="unbounded" /> 
    </xsd:sequence> 
</xsd:complexType> 

Auto generierte Code von VS:

public namespace.TasksListParameterDTO[] retrieveParameterTasksList(namespace.RetrieveParameterTasksListWSRequest RetrieveParameterTasksListWSRequest) { 
     namespace.RetrieveParameterTasksListWSRequest1 inValue = new namespace.RetrieveParameterTasksListWSRequest1(); 
     inValue.RetrieveParameterTasksListWSRequest = RetrieveParameterTasksListWSRequest; 
     namespace.RetrieveParameterTasksListWSResponse retVal = ((namespace.WebServiceV1x0)(this)).retrieveParameterTasksList(inValue); 
     return retVal.RetrieveParameterTasksListWSResponse1; 
    } 

Meine Frage: Warum Visual Studio tut ignoriert den Antworttyp und Rückkehr das Array drin? Wie kann ich die tatsächliche Antwort zurückgeben?

Vielen Dank!

Antwort

3

Visual Studio hat einen Proxy für Sie erstellt, der das Array in die richtige SOAP-Antwort einfügt, sobald es Ihren Code verlassen hat. Die korrekte SOAP-Nachricht sollte weiterhin von Ihrer Anwendung gesendet werden. Haben Sie getestet, welche XML-Daten von der Anwendung zurückgegeben werden?

Der Grund, dass es sich von anderen Methoden unterscheidet, liegt wahrscheinlich an den unterschiedlichen Verhaltensweisen zwischen dem DataContractSerializer und dem XmlSerializer. Im Allgemeinen versucht Visual Studio, den DataContractSerializer zu verwenden, um Ihre Service-Referenzen zu generieren. Dies erzeugt keine Request/Response-Objekte, sondern erzeugt Methoden, die den Inhalt der Request/Response-Objekte aufnehmen und zurückgeben (z. B. int Multiply(int a, int b);). Der DataContractSerializer ist jedoch restriktiver als der XmlSerializer, und manchmal muss Visual Studio auf den XmlSerializer zurückgreifen. In diesem Fall generiert es die Request/Response-Objekte, die Sie mit allem anderen sehen (z. B. MultiplyResponse Multiply(Multiply multiplyRequest);). Die gleiche XML-Antwort sollte unabhängig davon generiert werden, welcher Serializer von Visual Studio verwendet wird.

Wenn Sie mehr Kontrolle über die generierte SOAP-Nachricht benötigen oder Visual Studio nicht die richtige SOAP-Antwort erstellt, können Sie Visual Studio erzwingen, vollständige Nachrichtenverträge zu generieren. Bearbeiten Sie dazu die Servicereferenz, oder fügen Sie eine neue hinzu. Klicken Sie auf "Erweitert ..." und wählen Sie dann die Option "Nachrichtenverträge immer generieren". Die Nachrichtenverträge sind hier dokumentiert: https://msdn.microsoft.com/en-us/library/ms730255.aspx

+1

Ich habe versucht "immer Nachrichtenverträge generieren" und hat nicht funktioniert. – gmnnn

Verwandte Themen