c# - una - Referencia de servicio de Visual Studio El tipo de retorno WSDL no coincide
no se puede agregar referencia.dll c# (1)
Visual Studio ha creado un proxy para usted que envolverá la matriz en la respuesta correcta de SOAP una vez que deje su código. El mensaje SOAP correcto aún debe ser enviado por su aplicación: ¿ha probado qué XML se devuelve?
La razón por la que difiere de otros métodos probablemente se deba a las diferencias de comportamiento entre el DataContractSerializer y el XmlSerializer. En general, Visual Studio intentará utilizar DataContractSerializer para generar sus referencias de servicio. Esto no generará objetos Request / Response, sino que generará métodos que captarán y devolverán el contenido de los objetos Request / Response (por ejemplo, int Multiply(int a, int b);
). Sin embargo, DataContractSerializer es más restrictivo que XmlSerializer, y algunas veces Visual Studio tiene que recurrir a XmlSerializer. En este caso, generará los objetos Request / Response que está viendo con todo lo demás (por ejemplo, MultiplyResponse Multiply(Multiply multiplyRequest);
). Se debe generar la misma respuesta XML, independientemente del serializador que use Visual Studio.
Si necesita más control sobre el mensaje SOAP generado, o si Visual Studio no está creando la respuesta SOAP correcta, puede forzar a Visual Studio a generar contratos de mensajes completos. Para hacerlo, edite la referencia de servicio o agregue una nueva. Haga clic en "Avanzado ...", luego seleccione la opción "Generar siempre contratos de mensajes". Los contratos de mensajes están documentados aquí: https://msdn.microsoft.com/en-us/library/ms730255.aspx
Tenemos un backend de Java que sirve servicios web a través de WSDL. Hay algunas operaciones que devuelven xxWSResponse con solo 1 propiedad: una matriz.
Cuando agregamos la referencia de servicio en Visual Studio al servicio web, VS genera el código para devolver la matriz directamente, no la respuesta. Si hay más propiedades en la respuesta o más matrices, funciona como debería y devuelve la respuesta.
Muestra de operación:
<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>
Código generado automáticamente por 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;
}
Mi pregunta: ¿Por qué Visual Studio ignora el tipo de respuesta y devuelve la matriz en él? ¿Cómo puedo hacer que devuelva la respuesta real?
¡Gracias!