visual studio net microsoft example consume asp c# wcf web-services

c# - studio - ¿Por qué hay argumentos adicionales en mi referencia de servicio web wcf?



wcf web service c# (3)

Estoy tratando de convertir un servicio web ASP.Net a la aplicación WCF. El cliente está en .Net Compact Framework que no es compatible con WCF, así que necesito asegurarme de que WCF siga brindando soporte a los servicios web de estilo ASP. Cuando agrego la referencia del servicio web en Visual Studio, los métodos de la clase proxy generados tienen argumentos adicionales.

Por ejemplo, si un método se define como:

public void GetEmpInfo(int empNo)

Ese método aparecerá en la clase proxy como:

public void GetEmpInfo(int empNo, bool empNoSpecified)

¿Qué causa esto y cómo logro que se detenga?


.NET Compact Framework es compatible con un subconjunto de WCF. Puede revisar este soporte en MSDN . Eche un vistazo, puede ser suficiente para que pueda eliminar su soporte de servicios web heredado.


Mira esta publicación en el blog ...

¿De dónde vinieron estos miembros "especificados" booleanos extra y qué hacen? La respuesta es el esquema que el serializador de contrato de datos de WCF genera de forma predeterminada. Debido a la forma en que funciona su modelo de control de versiones, el serializador genera todos los miembros de datos como elementos opcionales. La pila de servicios web más antigua, ASP.NET Web Services ("ASMX"), usa un serializador diferente, el XmlSerializer, que mantiene el esquema completo y la fidelidad XML. El XmlSerializer asigna todos los elementos opcionales a dos miembros: uno representa los datos en sí y uno especifica si los datos están realmente presentes: este es el miembro "xxxSpecified". Estos miembros xxxSpecified deben establecerse en true para habilitar la serialización de los miembros de "datos reales" correspondientes.


Esto sucede para los tipos con un valor predeterminado no nulo. En estos casos, es imposible que el servicio web sepa si un parámetro se estableció en el valor predeterminado o simplemente no se configuró.

Puede deshacerse del parámetro de especificación adicional decorando su operación con el atributo [XmlSerializerFormat] como:

[OperationContract] [XmlSerializerFormat] string GetEmpInfo(int? empNo);

Este atributo también se puede agregar a nivel de Clase, y esto tendría sentido en la mayoría de los casos.

Entiendo que puedes manejar esta situación usando tipos que aceptan nulos ( int? ), Pero no pude solucionarlo con esto.