Значение типа DateTime исчезает при отправке запроса на сервер WCF - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть клиент WCF, который отправляет запрос в службу WCF. И клиент, и сервер работают локально. Запрос состоит из значения типа DateTime, значение имеет значение (например, DateTime.Now). Клиентский прокси WCF отправляет запрос. Однако все значения типа DateTime исчезают, когда я использую fiddler для захвата запроса перед его отправкой на сервер.

Обновление:

Я пытался и 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 голосов
/ 24 апреля 2014

Я решил эту проблему так:

...

    /// <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
0 голосов
/ 28 февраля 2012

Я не могу воспроизвести проблему, используя предоставленный вами код:

[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.

Кроме того, вы сказали, что выбрали XmlSerializer вместо DataContractSerializer, но это не так.понятно почему.DataContractSerializer используется по умолчанию из коробки и обладает большей производительностью, чем XmlSerializer.Если вы работаете только между двумя приложениями .net, вы также можете взглянуть на NetDataContractSerializer.Дэн Ригсби имеет хорошее сравнение из трех упомянутых сериализаторов.

...