WCF不会序列化所有属性

时间:2011-11-29 13:51:56

标签: .net wcf serialization soap service

我正在使用已在VS2010中作为服务引用导入的SOAP服务。我使用服务提供的请求对象调用其中一个服务。我遇到的问题是并非所有对象的属性都被序列化,或者不是通过线路发送。请求对象如下所示:

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
};

这是通过电线发送的内容。我用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>

其中两个参数Id和Status尚未发送到服务,我只是无法弄清楚原因。正在设置值,并且WSDL生成的属性是公共的,并且具有与要序列化的属性相同的序列化属性。

任何帮助都将不胜感激。

编辑---- 更新了服务引用生成代码

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

1 个答案:

答案 0 :(得分:23)

问题得到解决。错误是SOAP服务已更新,现在某些属性是可选的。 当字段/属性在SOAP消息中将 XX 标记为可选时,WCF会创建相应的额外 XXIsSpecified 属性,当必须将其设置为 true XX 值已设置。否则,WCF将不会序列化也不会发送该属性。

有多种方法可以查看属性是否设置为可选。

  • 在生成的Reference.cs文件中,每个可选项都有一个相应的IsSpecified属性,如下所示:private System.DateTime validFromField; private bool validFromFieldSpecified;

  • 您可以使用soapUI查看和测试wsdl

  • 使用chrome或其他浏览器浏览到wsdl,看看该元素是否具有minoccurs属性。如果它在那里并且它的值为0那么它是可选的。像这样<xs:element minOccurs="0" name="validFrom" type="xs:dateTime"/>