Cuando importo un servicio determinado usando "Agregar referencia de servicio" en Visual Studio 2008 (SP1) todos los mensajes de Solicitud/Respuesta se envuelven innecesariamente en Contratos de mensaje (denominados como -> "nombreoperación "+" Solicitar "/" Respuesta "+" 1 "al final).Agregar referencia de servicio genera contratos de mensaje
El generador de código dice:
// CODEGEN: Generating message contract since the operation XXX is neither RPC nor
// document wrapped.
Los chicos que están generando el WSDL de un servicio de Java dicen que están especificando DOCUMENTO literal/ENVUELTO.
Cualquier ayuda/puntero/pista sería muy apreciada.
Actualización: esto es una muestra de mi wsdl para una de las operaciones que parecen sospechosas. Tenga en cuenta la falta de coincidencia en el atributo del elemento de mensaje para la solicitud, en comparación con la respuesta.
<!- imports namespaces and defines elements -->
<wsdl:types>
<xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/">
<xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/>
<xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/>
<xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/>
<xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/>
</xsd:schema>
</wsdl:types>
<!- declares messages - NOTE the mismatch on the request element attribute compared to response -->
<wsdl:message name="myOperationRequest">
<wsdl:part element="tns:myOperation" name="request"/>
</wsdl:message>
<wsdl:message name="myOperationResponse">
<wsdl:part element="tns:myOperationResponse" name="response"/>
</wsdl:message>
<!- operations -->
<wsdl:portType name="MyService">
<wsdl:operation name="myOperation">
<wsdl:input message="tns:myOperationRequest"/>
<wsdl:output message="tns:myOperationResponse"/>
<wsdl:fault message="tns:myOperationFault" name="myOperationFault"/>
<wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/>
</wsdl:operation>
</wsdl:portType>
Actualización 2: Saqué todos los tipos que he tenido en mi espacio de nombres importados (que estaban en un xsd por separado) en el WSDL, como sospechaba la importación podría desencadenar la generación contrato mensaje. Para mi sorpresa, no fue el caso y tener todos los tipos definidos en el wsdl no cambió nada.
Luego, (por desesperación) comencé a construir wsdls desde cero y jugué con los atributos maxOccurs
de los atributos de elementos contenidos en un atributo de secuencia. Pude reproducir el comportamiento de generación de contrato de mensaje no deseado.
He aquí una muestra de un elemento:
<xsd:element name="myElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Jugando con maxOccurs
sobre los elementos que se utilizan en forma de mensajes (todas las peticiones y respuestas básicamente) ocurre lo siguiente:
- maxOcurrencias = "1" no desencadena el ajuste
- macOcccurs> 1 activa el ajuste
- maxOcurrencias = "sin límites" desencadena la envoltura
yo no era capaz de reproducir esto en mi WSDL producción todavía porque el anidamiento de los tipos es muy profunda, y me va a tomar tiempo para inspeccionar a fondo. Mientras tanto, espero que pueda llamar al timbre, cualquier ayuda muy apreciada.
también tenga en cuenta que estoy obteniendo ese error en todas las operaciones no solo en una particular. Parece que entiendo que esto podría deberse a un error en CUALQUIERA de las definiciones de tipo utilizadas por CUALQUIERA de las operaciones, esto haría que el DataContractSerialer fuera reemplazado por XmlSerializer, de ahí el MEssageContracts. ¿Tiene esta interpretación algún sentido? – JohnIdol