.net wcf wsdl nullable svcutil.exe

.net - svcutil.exe-Proxy generado que no permite campos con nulos



wcf wsdl (3)

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 usar ChannelFactory <> para crear sus proxies.

Intento 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 (minOccurs = "0"), por ejemplo:

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

Desafortunadamente, el proxy generado no permite que no especifique los valores (los parámetros no son anulables), y no hay campos "especificados" 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, noté 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 Añado la referencia (nada sucede después)

Proxy generado archivo WSDL

Comando utilizado: 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


Supongo que la clase proxy del cliente generada por svcutil tiene un campo / propiedad llamada 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" />

Ver el atributo "nullable"? Ese es el que se utiliza para hacer un campo realmente anulable: ahora puede tener una entrada como esta en su XML:

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

Bagazo


Es un problema porque minOccurs = "0" debería permitirle no emitir 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 tener el ''meetingId'' 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), porque si generas con la opción / wrapped:

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

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