2015-08-07 6 views
7

Abbiamo un backend Java che serve servizi Web tramite WSDL. Ci sono alcune operazioni che restituiscono xxWSResponse con solo 1 proprietà in esso: una matrice.Riferimento servizio Visual Studio Il tipo di ritorno WSDL non corrisponde

Quando aggiungiamo il riferimento del servizio in Visual Studio al servizio Web, VS genera il codice per restituire direttamente l'array, non la risposta. Se ci sono più proprietà nella risposta o più matrici funziona come dovrebbe e restituisce la risposta. campione

Operation:

<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 Codice generato da 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; 
    } 

La mia domanda: Perché il Visual Studio ignora il tipo di risposta e ritorno la matrice in esso? Come posso rendere la risposta effettiva?

Grazie!

risposta

3

Visual Studio ha creato per te un proxy che avvolgerà l'array nella risposta SOAP corretta una volta lasciato il codice. Il messaggio SOAP corretto deve ancora essere inviato dall'applicazione: hai verificato quale XML viene restituito da esso?

Il motivo per cui differisce da altri metodi è probabilmente dovuto a differenze di comportamento tra DataContractSerializer e XmlSerializer. Generalmente Visual Studio proverà a utilizzare DataContractSerializer per generare i riferimenti del servizio. Questo non genererà oggetti Richiesta/Risposta, ma genererà metodi che accolgono e restituiscono il contenuto degli oggetti Richiesta/Risposta (ad esempio int Multiply(int a, int b);). Tuttavia, DataContractSerializer è più restrittivo di XmlSerializer e talvolta Visual Studio deve tornare a XmlSerializer. In questo caso, genererà gli oggetti Richiesta/Risposta che stai vedendo con tutto il resto (ad esempio MultiplyResponse Multiply(Multiply multiplyRequest);). La stessa risposta XML dovrebbe essere generata indipendentemente dal serializzatore utilizzato da Visual Studio.

Se è necessario un maggiore controllo sul messaggio SOAP generato o se Visual Studio non sta creando la risposta SOAP corretta, è possibile forzare Visual Studio a generare contratti con messaggi completi. Per fare ciò, modifica il riferimento del servizio o aggiungine uno nuovo. Fai clic su "Avanzate ...", quindi seleziona l'opzione "Genera sempre i contratti dei messaggi". I contratti di messaggio sono documentati qui: https://msdn.microsoft.com/en-us/library/ms730255.aspx

+1

Ho provato "Genera sempre contratti di messaggio" e non ha funzionato. – gmnnn

Problemi correlati