.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");
}
}