2010-03-03 14 views
15

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.

+0

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

Respuesta

1

¿Usted intentó utilizar el scvutil Goto -> menú de inicio/Visual Studio 2008/Herramientas/VS símbolo de sistema

Tipo svcutil, a continuación, echa un vistazo a los parámetros, especialmente el/envuelta parámetro.utilizar el tiempo esto para generar su proxy, le da mucho más control sobre qué se está encendiendo

+0

Lo intenté con svcutil y tuve el mismo problema, pero no jugué con el parámetro/wrapper. Verificará que – JohnIdol

4

Aquí hay otro elemento a comprobar:

  1. Haga clic derecho en su referencia de servicio en el Explorador de soluciones y seleccione 'Configurar Referencia de servicio '

  2. Compruebe si se ha marcado o no' Siempre generar contratos de mensajes '.

+0

ya haya ido allí. ¡Esa casilla no está marcada, pero es una buena sugerencia! :) – JohnIdol

+1

Hizo el truco para mí. ¡Gracias! –

2

Aunque sé que esto es una entrada larga fuera de fecha, para aquellos que tropiezan en esta misma edición:

a comprobar que el proxy que se ha generado no contiene ningún matrices dentadas, por ejemplo,

(C#)

private string[][] mystring; 

(VB.NET)

Private myString()() As String 
4

Ha intentado cambiar el WSDL de manera que para cada instancia de elemento de la parte = "tns: myOperation" name = "solicitud ", cambiando el valor del atributo de nombre a 'parámetros'.

4

Tuve este problema y esto lo resolvió.

He utilizado este:

<wsdl:message name="Method"> 
     <wsdl:part name="parameters" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="parameters" element="s0:MethodResponse"/> 
    </wsdl:message> 

En lugar de:

<wsdl:message name="Method"> 
     <wsdl:part name="request" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="response" element="s0:MethodResponse"/> 
    </wsdl:message> 

Creo que alguien lo mencionó antes, pero no puede upvote su respuesta todavía!

Cuestiones relacionadas