.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)
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!