最新消息:阿里云双12优惠,史上最低折扣。

WCF服务代理如何理解与设置“FieldSpecified”属性?

服务器租用 aliyun 294浏览

16进制转换10进制 整数部分以及小数部分如何转换

在日常的计算机编程和学习中我们经常会与各种进制打交道,在没有确定一个正确的读法之前,人们在阅读十六进制或八进制数字或者十进制以外的进制时

WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。这些类通过一定方式被组织起来,共同协作,并为开发者提供了一个统一的编程模式。WCF之所以特殊,是在于它所应对的场景与普通的.NET类库不同,它主要用于处理进程间乃至于机器之间消息的 传递与处理,同时它引入了SOA的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用。实际上,WCF就是微软对于分布式处理的 编程技术的集大成者,它将DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准。

那么,对于WCF服务代理里面的“FieldSpecified”属性如何理解?

WCFDataContract,如下所示:

namespace MyCompanyName.Services.Wcf{

[DataContract(Namespace =”http://mycompanyname/services/wcf”)]

[Serializable]

publicclassDataContractBase

{

[DataMember]

publicDateTime EditDate {get;set;}

// code omitted for brevity…

}}

当我在Visual Studio中添加对此服务的引用时,将生成此代理代码:

/// <remarks/>[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Xml”,”2.0.50727.3082″)][System.SerializableAttribute()][System.Diagnostics.DebuggerStepThroughAttribute()][System.ComponentModel.DesignerCategoryAttribute(“code”)][System.Xml.Serialization.XmlTypeAttribute(Namespace=”http://mycompanyname/services/wcf”)]publicpartial classDataContractBase :object,System.ComponentModel.INotifyPropertyChanged {

privateSystem.DateTime editDateField;

privatebool editDateFieldSpecified;

/// <remarks/>

[System.Xml.Serialization.XmlElementAttribute(Order=0)]

publicSystem.DateTime EditDate {

get{

returnthis.editDateField;

}

set{

this.editDateField =value;

this.RaisePropertyChanged(“EditDate”);

}

}

/// <remarks/>

[System.Xml.Serialization.XmlIgnoreAttribute()]

publicbool EditDateSpecified {

get{

returnthis.editDateFieldSpecified;

}

set{

this.editDateFieldSpecified =value;

this.RaisePropertyChanged(“EditDateSpecified”);

}

}

// code omitted for brevity…}

正如你所看到的,除了生成一个支持属性外EditDate,还会<propertyname>Specified生成一个附加属性。一切都很好,除了当我做以下事情时:

DataContractBase myDataContract =newDataContractBase();

myDataContract.EditDate =DateTime.Now;

newMyServiceClient.Update(newUpdateRequest(myDataContract));

该EditDate服务的端点没有被拾起(没有出现在传输的XML中)。

我调试了代码,发现虽然我正在设置EditDate,但是该EditDateSpecified属性并没有true像我预期的那样设置; 因此,XML序列化程序忽略了值EditDate,即使它设置为有效值。

作为一个快速入侵,我修改了EditDate属性,如下所示:

/// <remarks/>

[System.Xml.Serialization.XmlElementAttribute(Order=0)]

publicSystem.DateTime EditDate {

get{

returnthis.editDateField;

}

set{

this.editDateField =value;

// hackhackhack

if(value !=default(System.DateTime))

{

this.EditDateSpecified =true;

}

// end hackhackhack

this.RaisePropertyChanged(“EditDate”);

}

}

现在代码按预期工作,但当然每次我重新生成代理时,我的修改都会丢失。我可以将调用代码更改为以下内容:

DataContractBase myDataContract =newDataContractBase();

myDataContract.EditDate =DateTime.Now;

myDataContract.EditDateSpecified =true;

newMyServiceClient.Update(newUpdateRequest(myDataContract));

但是这也看起来像是浪费时间。

转载请注明:小猪云服务器租用推荐 » WCF服务代理如何理解与设置“FieldSpecified”属性?