services net example entre diferencia cuál crear consumir .net wcf serialization soap service

.net - net - WCF no serializa todas las propiedades



wcf web service c# (1)

El problema esta resuelto. El error fue que el servicio SOAP se había actualizado y algunas propiedades ahora son opcionales. Cuando un campo / propiedad dice que XX está marcado como opcional en un mensaje SOAP, WCF crea una propiedad XXIsSpecified adicional que debe establecerse en verdadero cuando se establece el valor XX . De lo contrario, WCF no serializará ni enviará esa propiedad.

Hay diferentes formas de ver si una propiedad está configurada como opcional.

  • En el archivo Reference.cs generado, cada opción opcional tendrá una propiedad IsSpecified correspondiente, así: private System.DateTime validFromField; private bool validFromFieldSpecified; private System.DateTime validFromField; private bool validFromFieldSpecified;

  • Puede usar soapUI para ver y probar el wsdl

  • Busque wsdl con Chrome u otro navegador y vea si el elemento tiene el atributo minoccurs. Si está allí y tiene el valor de 0, entonces es opcional. como este <xs:element minOccurs="0" name="validFrom" type="xs:dateTime"/>

Estoy consumiendo un servicio SOAP que se ha importado como referencia de servicio en VS2010. Llamo a uno de los servicios con un objeto de solicitud proporcionado por el servicio. El problema que tengo es que no todas las propiedades del objeto están serializadas, o mejor dicho, no se envían por cable. El objeto de solicitud se ve así:

var serviceRequest = new UpdateRequest{ StoreId = request.StoreId, Id = request.Id, Status = (Status)Enum.Parse(typeof(Status), request.myStatus.ToString()), parameters = request.Parameters, validFrom = request.ValidFrom.Value, validFromSpecified = request.ValidFromSpecified };

Y aquí está lo que se envía por cable. Lo he capturado con wireshark

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <updateStore xmlns="http://localhost.service.com/"> <StoreRequest> <StoreId>1234</StoreId> <validFrom>2011-11-29T00:00:00</validFrom> <parameters> <param1>true</param1> </parameters> </StoreRequest> </updateStore> </s:Body> </s:Envelope>

Dos de los parámetros, Id y Estado no se han enviado al servicio, y simplemente no puedo entender por qué. Los valores se establecen y las propiedades generadas WSDL son públicas y tienen los mismos atributos de serialización que las propiedades que se están serializando.

Cualquier ayuda sería apreciada.

Editar ---- Actualizado con código generado de referencia de servicio

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://myservice.com/")] public partial class StoreUpdateRequest : object, System.ComponentModel.INotifyPropertyChanged { private long StoreIdField; private long IdField; private bool IdFieldSpecified; private Status StatusField; private bool StatusFieldSpecified; private long storeIdField; private bool storeIdFieldSpecified; private System.DateTime validFromField; private bool validFromFieldSpecified; private System.DateTime validToField; private bool validToFieldSpecified; private technicalParameters parametersField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Order=0)] public long StoreId { get { return this.StoreIdField; } set { this.StoreIdField = value; this.RaisePropertyChanged("StoreId"); } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Order=1)] public long Id { get { return this.IdField; } set { this.IdField = value; this.RaisePropertyChanged("Id"); } }