新睿云

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

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

作者/来源:小睿 发布时间:2019-11-15

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

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

热门标签
new year
在线咨询
咨询热线 400-0505-565
投诉与建议
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待