2009-06-17 10 views
6

Estoy tratando de consumir un servicio web especificado utilizando WSDL creando un proxy WCF usando svcutil.exe, pero el WSDL especifica que algunas de las operaciones tienen parámetros que son opcionales (minOcurrencias = "0"), por ejemplo:svcutil.exe - Proxy generado que no permite campos con nulos

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 

por desgracia, el proxy generado no me permite no especifica los valores (los parámetros no son anulables), y no hay campos "especificadas" como parte de la llamada para indicar al proxy que no se debe enviar ningún valor.

¿Hay alguna forma de usar svcutil para generar un proxy que me permita hacer esto?

(En una nota lateral, me di cuenta a través de mi investigación que otros pudieron generar estos campos extra "especificados" correctamente utilizando la función "Agregar referencia de servicio", pero por alguna razón Visual Studio no parece querer generar el proxy después de agregar la referencia (nada sucede después))

WSDL File Generated Proxy

comando utilizado: svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl/interna /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs/config : App.config/nologo

+0

SvcUtil en general es un PITA y no lo uso, pero mis servicios y WCF por lo que tengo una tarea mucho más fácil. –

+0

Es bastante extraño que las propiedades especificadas no se generen ... Esta es la forma en que WCF maneja los tipos de valores opcionales. No hay errores proporcionados por svcutil? Si no, ¿puede proporcionarnos el archivo WSDL y qué se genera? – Philippe

+0

Claro, el WSDL está disponible en: http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl Estoy usando el siguiente comando para generar el proxy: svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl/internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs/config :. . \ App.config/nologo Y aquí está lo que se genera: http://pastebin.com/m20688d39 ¡Gracias! – David

Respuesta

6

Supongo que la clase proxy del cliente generada por svcutil tiene un campo/propiedad llamado meetingId de tipo int - ¿verdad? Sí, esto no admite nulos, pero apuesto a que también tiene un campo/propiedad booleana llamada meetingIdSpecified; solo si se establece en true, el servicio realmente lo verá; si no lo configura, entonces el servicio no verá el valor, por lo que es casi como si fuera NULL.

Además, tampoco especificó que el campo sea anulable en su XSD; especificó que es opcional. Para que sea nulo, use esta sintaxis aquí:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" 
      nillable="true" /> 

Consulte el atributo "nullable"? Esa es la que se utiliza para hacer un campo muy anulable - Ahora usted puede tener una entrada como esta en su XML:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <meetingId xsi:nil="true" /> 
</root> 

Marc

+0

Esos campos especificados no se muestran, pero tiene razón acerca de lo nillable ... si lo agrego al WSDL, entonces svcutil lo hace generar correctamente parámetros anulables para las llamadas. Gracias – David

+0

Tengo un caso en el que el elemento es opcional (minOccurs = "0") y intencionalmente no anulable. Tampoco obtengo los campos "especificados" ... a menos que incluya la opción de línea de comando "/ serializador: XmlSerializer". Supongo que el DataContractSerializer predeterminado no maneja esta situación correctamente ...? La única forma de que el código DataContractSerializer funcione es modificando manualmente el código generado para especificar EmitDefaultValue = "false" en el DataMemberAttribute, pero nunca podrá enviar cero, porque eso se interpretaría como una ausencia. valor por el servidor. – ALEXintlsos

1

No use SVCUtil si no funciona para usted. Si el servicio no es muy complicado, puede intentar escribir la interfaz de servicio de forma manual y utilizar ChannelFactory <> para crear sus proxies.

+0

La razón principal por la que esperaba usar svcutil fue para ahorrar tiempo. No estoy seguro de si podré implementar todo manualmente lo suficientemente rápido. – David

+0

(unos años más tarde) ¿tiene un enlace a este método? –

+0

que metodo? (Fuera de contexto, unos años más tarde) –

0

Es un problema porque minOcurrencias = "0" debe permitir que usted no emiten el valor de 'meetingId' y el proxy generado no lo permite.

Solo consume el servicio, por lo que no tiene control sobre el wsdl y no puede agregar nillable = "true" en el wsdl para que 'meetingId' sea opcional en su proxy.

Si genera su proxy con wsdl.exe, y no svcutil.exe, tendrá el campo adicional 'meetingIdSpecified' que le permite elegir si desea emitir el campo meetingId.

wsdl.exe http:///myservice?wsdl 

Pero con wsdl.exe consumirá su servicio con el servicio web asp.net, y no con WCF.

creo que el campo que falta es un error en svcutil.exe (para mí 4.0.30319.17929), ya que si se genera con la opción/envuelta:

svcutil.exe /wrapped http:///myservice?wsdl 

..then también tendrá el campo 'meetingIdSpecified' generado!

Cuestiones relacionadas