向WCF服务器发送请求时,DateTime类型值消失

时间:2012-02-27 18:41:30

标签: c# wcf web-services

我有一个向WCF服务发送请求的WCF客户端。客户端和服务器都在本地运行。该请求由DateTime类型值组成,该值具有值(例如DateTime.Now)。 WCF客户端代理发送请求。但是,当我在请求发送到服务器之前使用fiddler捕获请求时,DateTime类型的所有值都会消失。

更新

我手动尝试了DataContractSerializer和XmlSerializer来串行化WCF类(如下所示),结果是XmlSerializer省略了DateTime值(即DateTime值消失了),DataContractSerializer保留了值。

因为WCF服务器正在使用XmlSerializer,并且因为客户端代理类的数量,理想情况下客户端应该使用XmlSerializer。

WCF客户端:

WCF代理类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
//[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:core_e-nbp-v1.0")]
public partial class ClaimApplication : object, System.ComponentModel.INotifyPropertyChanged {

private System.DateTime hBEffectiveDateField;


            /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(DataType = "date", Order = 3)]
    public System.DateTime HBEffectiveDate {
        get {
            return this.hBEffectiveDateField;
        }
        set {
            this.hBEffectiveDateField = value;
            this.RaisePropertyChanged("HBEffectiveDate");
        }
    }

}                               




//Assign a random DateTime value
             claimApplication.HBEffectiveDate = DateTime.Now.ToUniversalTime();

//manully serialize to check the DateTime using XmlSerializer
            XmlSerializer s = new XmlSerializer(typeof(ClaimApplication));
            StreamWriter sw = new StreamWriter(@"D:\xmlsamples\XmlSerializer.xml");
            s.Serialize(sw,claimApplication);


            sw.Dispose();


//manully serialize to check the DateTime using DataContractSerializer
                DataContractSerializer dc  = new DataContractSerializer(typeof(ClaimApplication));
                FileStream fs = new FileStream(@"D:\xmlsamples\DataContractSerializer.xml", FileMode.CreateNew);
                dc.WriteObject(fs,claimApplication);
                fs.Dispose();

WCF服务器:

 [System.Xml.Serialization.XmlElementAttribute(DataType = "date")]
    public System.DateTime EffectiveDate
    {
        get { return this.EffectiveDateField; }
        set { this.EffectiveDateField = value; }
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我无法使用您提供的代码重现该问题:

[TestFixture]
public class When_Scenario
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
    [System.SerializableAttribute()]
    //[System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:core_e-nbp-v1.0")]
    public partial class ClaimApplication : object, System.ComponentModel.INotifyPropertyChanged
    {

        private System.DateTime hBEffectiveDateField;


        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "date", Order = 3)]
        public System.DateTime HBEffectiveDate
        {
            get
            {
                return this.hBEffectiveDateField;
            }
            set
            {
                this.hBEffectiveDateField = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    } 

    [Test]
    public void Should_Assertion()
    {
        ClaimApplication claimApplication = new ClaimApplication();
        claimApplication.HBEffectiveDate = DateTime.Now.ToUniversalTime();


        XmlSerializer s = new XmlSerializer(typeof(ClaimApplication));

        s.Serialize(Console.Out, claimApplication);
    }
}

因为您正在使用XmlSerialization,所以除非要序列化复杂类型,更改要在Xml中使用的名称空间或属性名称,否则不必修饰要序列化的成员。我可以看到有一些生成的代码,但不清楚生成它的原因和原因。我唯一能看到的是服务器端的实体和客户端之间存在名称差异。为了使其工作,您需要在XmlElementAttribute中覆盖客户端或服务器端的名称。

除此之外,你已经说过你已经选择在DataContractSerializer上使用XmlSerializer,但目前尚不清楚原因。默认情况下,DataContractSerializer开箱即用,比XmlSerializer更具实用性。如果您只在两个.net应用程序之间进行操作,您还可以查看NetDataContractSerializer。 Dan Rigsby提到的三个序列化程序中有comparison个好。

答案 1 :(得分:0)

我解决了这个问题:

...

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(DataType = "date", Order = 1)]
    public System.DateTime BirthDate
    {
        get
        {
            return this.birthDateField;
        }
        set
        {
            this.birthDateField = value;
            this.RaisePropertyChanged("BirthDate");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool BirthDateSpecified {
        get {
            return this.birthDateFieldSpecified;
        }
        set {
            this.birthDateFieldSpecified = value;
            this.RaisePropertyChanged("BirthDateSpecified");
        }
    }

...

contact.BirthDate = DateTime.Now;
contact.BirthDateSpecified = true; //<-- See here