我有一个向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; }
}
有什么想法吗?
答案 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