WCF中Datacontract free和Messagecontract free的区别

//这是 WCF 服务器端,某个类的代码,返回一个自定义类 TradeTO 的实例,且此 TradeTO 类有属性也有「方法」public com.公司.vehicle.to.TradeTO calculate (com.公司.vehicle.to.TradeTO tradeTO){
com.公司.vehicle.sb.CalculatorSB.calculateMoney (tradeTO);
return tradeTO;}
TradeTO 类的实例,希望能在 WCF 中被传输。此类已在 Server-side 被标示为 [DataContract],但由于成员标示 [DataMember] 只适用于 Property、Field,不适用于 Method。导致返回 WCF client-side 的 TradeTO 类的实例,在客户端,会调用不到其 方法: Method1(),如下 :
using System.Runtime.Susing System.ServiceM[DataContract]public class TradeTO{
[DataMember]
public string strName = "吴小弟";
[DataMember]
public string StrName { get; set; }
// 这个 Method1 方法,在客户端无法调用 (此为本帖目前的问题所在)
public string Method1()
return "this is Method1...";
我试过其他的做法,例如把 Method1() 标示为 [OperationContract],也把 TradeTO 类标示为 [ServiceContract],并将该类发布为 WCF 服务,如下 :
using System.Runtime.Susing System.ServiceM[DataContract][ServiceContract]public class TradeTO{
[DataMember]
public string strName = "吴小弟";
[DataMember]
public string StrName { get; set; }
// 这个 Method1 方法,在客户端无法调用 (此为本帖目前的问题所在)
[OperationContract]
public string Method1()
return "this is Method1...";
虽然编译无误。但结果都一样,无效,客户端就是无法在返回的 TradeTO 里 :public com.tfmi.vehicle.to.TradeTO calculate (com.tfmi.vehicle.to.TradeTO tradeTO)找到、调用这个 TradeTO 实例的方法,只能找到它的 Property、Field (标示为 [DataMember] 的成员)---------------------------------------------------------------------------------虽然知道这是 .NET WebService、WCF 的默认行为,但仍想请教,有无其他解决方案?或有其他高手有独特的见解。先谢谢各位。---------------------------------------------------------------------------------
园豆:1558
提问于: 15:29
问题补充:
别人提出的另一种思考方向:http://topic.csdn.net/u//b7b7625f-cdfc-4bb7-f937ccae.html
所有回答(1)
其实你没有必要把方法写到TradeTO中,你也知道的&[DataMember] 只适用于 Property、Field,那么你可以把方法定义另外一个类中
园豆:1558
园豆:1558
&&&您需要以后才能回答,未注册用户请先。wcf 中如何传递 DataContract实体类中的方法_百度知道
wcf 中如何传递 DataContract实体类中的方法
现有一个实体类[DataContract]
public class MessageResult
bool _IsSuccess =
string _Result = string.E
string _Message = string.E
MessageType _MessageSendType = MessageType.SmsM
/// &summary&
/// 是否发送成功
/// &/summary&
[DataMember]
public bool IsSuccess
get { return _IsS }
set { _IsSuccess = }
/// &summary&
/// 返回信息
/// &/summary&
[DataMember]
public string Result
get { return _R }
set { _Result = }
/// &summary&
/// 发送类型
/// &/summary&
[DataMember]
public MessageType MessageSendType
get { return _MessageSendT }
set { _MessageSendType = }
/// &summary&
/// 发送结果
/// &/summary&
[OperationContract]
public string GetReturnMessage()
return _MessageSendType + &:& + _IsSuccess.ToString().ToLower() + &|& + _R
}我想在使用处可以调用方法 MessageResult result = new MessageResult();Console.Write(result.GetReturnMessage());已尝试过用[DataMember]声明改方法 [DataMember] public string GetReturnMessage()但是也不行,需要继承接口?可是这个是实体类啊,继承接口就逻辑错误了
就是接口的返回值啊
[ServiceContract(Name = &IMessageService&, Namespace = &JftCommonWcfServices.Sms&)]
public interface IMessageService
/// &summary&
/// 发送消息
/// &/summary&
/// &param name=&parameter&&&/param&
/// &returns&&/returns&
[OperationContract]
MessageResult Send(MessageParameter parameter);
}现在问题是返回值对象MessageResult 里面的属性是可以访问的,只有哪个拼接的方法没办法传递,调用端点不出来
提问者采纳
消息实体类,需要在契约服务中,进行传递,也就是接口的参数或返回值!才行
就是接口的返回值啊现在问题是返回值对象MessageResult 里面的属性是可以访问的,只有哪个拼接的方法没办法传递,调用端点不出来
你用的是数据契约,数据契约里不能有方法!你把那个方法放在接口里就行了
提问者评价
我想我明白了
其他类似问题
按默认排序
其他1条回答
第一,声明实体类;第二,声明接口;第三,实现接口;最好是分三个类文件。
为一个实体类自身的验证数据方法,定义一套接口?我不是没想过,但是非要这样吗,难道不是接口里面定义的方法,调用方就无法使用吗?
[OperationContract],[DataContract], [DataMember]理解了这个就知道怎样做了?
wcf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在之前写的一篇文章中,提到当在WCF中创建一个类,SL中引用该WCF服务后该类会变成 XXClient的样子,当初初学(现在也是,不过要好一点点),对Wcf服务和Sl之间的关系看得比较片面。其实在Wcf中创建ServiceContract契约标注的类的时候才会在Sl中变成XXClient的形式的类,而还有一种创建Wcf类的契约指定DataContract,这个契约的用途主要是制订一个类的数据结构,提供给引用其服务的客户端共享类型。
在通过wcf将一个数据集合传递给Sl的时候,我们会发现,异步完成事件的参数e的Result获得的数据集合是System.Collections.ObjectModel.ObservableCollection泛型的,如果,我们的wcf中返回的是一个DataView,那么在Sl中绑定这个结果是会出错的,因为Sl中并没提供DataView类,那怎么办呢?
于是,我们就会想自己写一个数据集合类来返回给SL,那么SL那边是不是也要写个相同的类来接收?Sl的数据绑定是可以通过绑定类的属性来实现的,但是,wcf上定义的类如何让Sl知道就是和他自己定义的类是一样的??
我们是写的一样的,可是SL不这么认为,就算一模一样,他们依然是两个类,不可共用的,也不存在继承关系。
于是,在创建wcf就得用DataContract定义一个类型出来,这样定义之后,sl上就可以共享这个类了,这个服务被sl引用后,这个类就跟sl自己的一样,sl和wcf签订了一个契约,我们都用这个类吧。这时,问题就解决了。
我们获取一个数据集合,比如说DataView ,然后将这个集合中的每一项的每一个字段作为属性赋值给那个DataContract指定的类的实例,有多少项就得创建多少个这个类的实例,然后创建一个List泛型来存储这一堆的实例。之后我们就将List泛型返回给SL,Sl获得这个List集合后,一看,泛型指定的是DataContract定义的类,正是wcf契订的那个类,sl引用了这个服务,当然也就共享了这个类,这个类也是sl自己的,好,sl虽然获得的依然是System.Collections.ObjectModel.ObservableCollection泛型,但是泛型里的类型是它所了解的那个类,那么就可以直接将结果绑定到类似DataGrid的控件上了。
&DataContract标注这个类的时候,其要勇于共享的字段或属性需要用DataMember标注,就像ServiceContract标注的类里的要共享的方法需要用OperationContract标注一样。
很困了,随便写,改天有空整理,白话讲出来也就这个意思。
另外,Sl中 DataGrid绑定数据时,实际上是绑定一个由N个类实例组合的集合,该集合的每一项就是一个类实例,DataGird绑定这个集合的时候,每一行是一项,每一行的每一列是该项的类的每一个属性。也就是说,一行就是一个类实例,一列就是一个实例的一个属性
贴点代码:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class WebWcf
[OperationContract]
public List&BookItem& GetBookList()
DataView dv = new DataView();
DataClass dc = new DataClass();
dv = dc.GetBooks(DateTime.Now.Date, DateTime.Now.Date.AddDays(1));
dv.Sort = "ID Desc";
List&BookItem& list = new List&BookItem&();
for (int i = 0; i & dv.C i++)
bi = new BookItem();
bi.ID = (int)dv[i]["ID"];
bi.Name = dv[i]["Name"].ToString();
bi.Peoples = (int)dv[i]["Peoples"];
bi.Phone = dv[i]["Phone"].ToString();
bi.Remark = dv[i]["Remark"].ToString();
bi.Remark2 = dv[i]["Remark2"].ToString();
bi.Status = (int)dv[i]["Status"];
bi.AddTime = (DateTime)dv[i]["AddTime"];
bi.BookTime = (DateTime)dv[i]["BookTime"];
list.Add(bi);
[DataContract]
public class BookItem
[DataMember]
public int ID;
[DataMember]
public string N
[DataMember]
public DateTime BookT
[DataMember]
public int P
[DataMember]
public DateTime AddT
[DataMember]
public string P
[DataMember]
public string R
[DataMember]
public string Remark2;
[DataMember]
public int S
public partial class Page : UserControl
public Page()
InitializeComponent();
private void UserControl_Loaded(object sender, RoutedEventArgs e)
BookListBind();
public void BookListBind()
WebWcf.WebWcfClient wc = new BookOnline.WebWcf.WebWcfClient();
wc.GetBookListAsync();
wc.GetBookListCompleted += new EventHandler&BookOnline.WebWcf.GetBookListCompletedEventArgs&(wc_GetBookListCompleted);
void wc_GetBookListCompleted(object sender, BookOnline.WebWcf.GetBookListCompletedEventArgs e)
System.Collections.ObjectModel.ObservableCollection&BookOnline.WebWcf.BookItem& members = e.R
BookList.ItemsSource =
阅读(...) 评论()3675人阅读
WCF 基础之契约(Contract)契约(Contract)是 WCF 的消息标准,告知客户端如何与服务器联系交互。契约是平台中立的,也就说我们可以使用其它平台(包括开发和系统平台)来调用服务。WCF 中包含 4 种契约,分别是用于定义服务操作(Operations)的 Service Contract,定义自定义数据结构的 Data Contract,定义错误异常的 *Fault Contract,以及直接控制消息格式的 Message Contract。它们算是WCF的核心之一,如果你要使用WCF,就需要了解他们。
Service contracts : 定义客户端可以使用哪些服务操作。
Data contracts : 定义服务传输的数据类型。WCF 定义了一些隐式数据契约,像 int、string 等,更多时候我们需要使用 DataContractAttribute 显式定义那些自定义数据结构的数据契约。
Fault contracts : 定义服务引发的错误信息,以及如何传递这些异常给客户端。
Message contracts : 允许我们直接操控服务消息内容和格式,可以是类型化或无类型的。
服务契约(Service Contract)一般情况下,我们用接口(Interface)来定义服务契约(Service Contract)。虽然我们也可以使用 Class,但使用接口的好处更明显一些。便于契约的继承,不同根的类型可以自由实现相同的契约。
同一服务类型可以实现多个契约。
和接口隔离原则相同,我们随时可以修改服务类型。
便于制定版本升级策略,让新老版本的服务契约同时使用。
WCF 使用特性 ServiceContractAttribute 标定服务契约,OperationContractAttribute 标定服务方法。
public interface ICalculate
double Add(double a, double b);
OperationContract 只能用于 Method,只有添加了此特性的方法才能被客户端调用。它甚至可以用来标注私有方法,这显然超出了面向对象的规则,而更多的是 SOA 的方式。SOA 只是分布式系统的架构体系,在架构体系内部我们依然采取面向对象的原则来编码,所以标注私有方法是不被推荐的,这也是使用接口作为服务契约的一个好处(接口中无法定义私有方法)。异步 Asynchronous 在WCF中,如果在服务契约中建立了异步方法,那么客户端代理将同时存在异步和非异步版本。 设置OperationContract的AsyncPattern:=True 即可以建立异步方法 双向通讯 Duplex 通过在服务契约中指定CallbackContract:=GetType(ICalculatorDuplexCallback)即可以指定回调接口。 在回调的时候,由于系统会确认执行过程。所以,为了避免死锁,一般加上(IsOneWay:=True)&关键字。 Oneway 在我们的程序中,有些服务是不需要确认是否到达到服务器的或者没有返回值的。这个时候我们可以设置IsOneWay:=True 这样,WCF便不会等到执行完才返回了。 Session 虽然在SOA中,提议每个服务请求都是独立的。但是,我们有时候需要保存一些数据,比如:用户ID。这个时候,我们可以把这个数据保存回话中。 WCF中,支持3中回话模式 1. Pre-Call: 服务实例被释放,客户端抛出 FaultException,客户端代理对象无法继续使用。2. Pre-Session: 服务实例被释放,会话终止。客户端抛出 FaultException,客户端代理对象无法继续使用。3. Singleton: 服务实例依旧运行,会话终止。客户端抛出 FaultException,客户端代理对象无法继续使用。 流 Stream 在WCF中也支持流传输,这时候,有点类似打开TCP端口~。对于传输大量数据比较有效率,例如:上传文件。记得在使用的时候配置好最大消息的大小 ServiceContract 的属性
ConfigurationName: 其设置信息在配置文件中的名称。
Name / Namespace:自定义该服务契约的名称和命名空间。建议设置服务契约的 Name 和 Namespace,这样生成的客户端的代理文件会使用自定义名称来命名相关代理类型,即便我们日后对服务器端的契约名称进行重构也不会影响到客户端。
SessionMode:设置服务契约的 Session 方式,包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持,默认情况下会自动启用,另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。
CallbackContract:设置 duplex 模式时的回调类型。
ProtectionLevel:指定消息保护方式,可以对消息进行加密和签名处理。
OperationContract 的属性
AsyncPattern:用于定义异步服务方法。
IsInitiating:指示服务方法能否启动一个 Session。
IsTerminating:指示服务方法调用完成是否结束 Session。
数据契约(Data Contract)数据契约(Data Contract)是用来标识用户自定义类型和序列化。DataContractAttribute、DataMemberAttribute 来标注自定义数据类型,这样我们就可以在服务方法中传递复杂的数据体了。使用之前,我们需要添加 System.Runtime.Serialization.dll 引用。由此我们可以看出其基本的开发模式,那就是使用 ServiceContract、OperationContract 执行运算,而使用 DataContract、DataMember 作为可序列化的数据载体。当然,我们也可以使用 "" 代替 ""。其实,数据契约主要是定义数据的格式(契约)。DataMember()是告诉序列化引擎要序列化的那个部分(关于序列化,注意一点,反序列化时可以访问任一字段,作用域关键字不起作用,这可能会暴露安全问题。)
public struct Number
public double Num1;
public double Num2;
public Number(double num1, double num2)
this.Num1 = num1;
this.Num2 = num2;
DataContract 的属性 Name / Namespace:自定义名称和命名空间。 DataMember 的属性 Name:自定义名称。 IsRequired:指示该成员序列化前必须被赋值。 DataContractSerializer 实际上序列化是一个过程,不过这个过程大多徐情况下被系统自动实现了。默认情况下,WCF 使用 DataContractSerializer 引擎对相关参数进行序列化,这也是 WCF 推荐的方式。另外一个选择是 XmlSerializer,也就是 ASP.NET Web Service 所使用的序列化引擎。XmlSerializer 仅支持 DataContractSerializer 所支持的部分类型,但它允许你使用 XmlAttributeAttribute 等特性对序列化生成的 XML 进行更多的控制。 DataContractSerializer 支持的类型: 支持所有的基本类型,还包括 XmlElement 和 DateTime 这样的常用类型。 支持使用 DataContractAttribute 标记的类型。 支持使用 SerializableAttribute 标记或者实现 ISerializable 接口的类型。 实现 IXmlSerializable 接口的类型。 大多数集合(含泛型)类型,包括常用的 Array、List、IList 等。 KnownTypes 在OO中,对象继承是很常见的,但如果在WCF直接使用继承后,实际上被分成了2个独立的类。这时就需要使用KnownType来标识,这样在客户端生成代理后就变成继承的了。 还可以通过配置文件指定
消息契约(Message Contract)消息契约可以算是数据契约的一个分类,专为SOAP而生的。可以控制消息的格式。数据是放在Header 还是Body中。非类型化(Untyped) 可以通过System.ServiceModel.Channels.Message类来直接构造消息,不过这个必须指定动作的地址,用来确定是那个操作被执行。 这样变可以不用构建类型了,不过会很累。。 非包装(Unwrapped)WCF对消息序列化的时候,可以决定是否对消息进行包装。 如果,和其他系统整合的话,可能需要去掉包装,手动控制。 样式 可以通过设置XmlSerializerFormat的Style和Use可以使用样式 使用XMLReader可以通过Message的GetReaderAtBodyContents 可以获取消息的XML部分
错误契约(Fault Contract)错误契约Fault Contract主要是来告诉一个服务或操作产生错误后,这个消息是什么样子的。 在SOA中,并没有限制客户端是什么平台,事实上,连服务端也是。只有契约没有变。
============================================
在WCF中,契约分为四种,它们分别为:
用于定义服务操作的服务契约:Service Contract
这种级别的契约又包括两种:ServiceContract和OperationContract
ServiceContract用于类或者结构上,用于指示WCF此类或者结构能够被远程调用,而OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。
1: [ServiceContract]
2: public interface ICalculate
[OperationContract]
double Add(double a, double b);
用于自定义数据结构的数据契约:Data Contract
数据契约也分为两种:DataContract和DataMember.DataContract用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。 我们还可以使用 DataContractAttribute、DataMemberAttribute 来标注自定义数据类型,这样我们就可以在服务方法中传递复杂的数据体了。使用之前,我们需要添加 System.Runtime.Serialization.dll 引用。由此我们可以看出其基本的开发模式,那就是使用 ServiceContract、OperationContract 执行运算,而使用 DataContract、DataMember 作为可序列化的数据载体。当然,我们也可以使用 "[Serializable]" 代替 "[DataContract]"。
1: [DataContract]
2: public class User
int _age = 27;
[DataMember]
public int Age
get { return _ }
set { _age = value; }
string _userName = "wang.yq";
[DataMember]
public string UserName
get { return _userN }
set { _userName = value; }
用于自定错误异常的异常契约:Fault Contract
FaultContract用于自定义错误异常的处理方式,默认情况下,当服务端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息,此时,我们可以自定义异常消息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。
用于控制消息格式的消息契约:Message Contract
简单的说,它能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。
ServiceContract
ConfigurationName: 其设置信息在配置文件中的名称。
Name / Namespace:自定义该服务契约的名称和命名空间。建议设置服务契约的 Name 和 Namespace,这样生成的客户端的代理文件会使用自定义名称来命名相关代理类型,即便我们日后对服务器端的契约名称进行重构也不会影响到客户端。
SessionMode:设置服务契约的 Session 方式,包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持,默认情况下会自动启用,另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。
CallbackContract:设置 duplex (双向通信)模式时的回调类型。
ProtectionLevel:指定消息保护方式,可以对消息进行加密和签名处理。
OperationContract
AsyncPattern:用于定义异步服务方法。
IsInitiating:指示服务方法能否启动一个 Session。
IsTerminating:指示服务方法调用完成是否结束 Session。
DataContract
Name / Namespace:自定义名称和命名空间。
DataMember
Name:自定义名称。
IsRequired:指示该成员序列化前必须被赋值。
契约是独立于平台的么?
&&& WCF作为一种能够跨平台的体系框架,其应用肯定会有异构,异网的情况发生,那么作为通讯依据的契约能否自动适用于上述情况呢?答案是肯定的,契约是独立于平台之外的,它只约束通讯的双方应该遵守什么样的规则,而丝毫不管双方各自采用的是什么样的技术和什么样的操作系统,也只有这样,WCF才能有真正的生命力。
契约和以往哪种技术比较相像,又有什么不同?
&&& 如果非要拿契约和以往的技术相比较的话,契约和asp.net xml web service的声明性编程模型甚是相似,比如在web service中在类上标记WebServiceAttribute便可以将此类用于远程调用,而将方法添加WebMethondAttribute也可以将其暴露给远程客户端,这和WCF中的ServiceContract和OperationContract简直如出一辙,但不同的是,WCF中的契约要比Xml Web Service中的要详尽的多,比如ServiceContract和OperationContract可以直接使用在接口上面,而实现该接口的类就继承了这种契约声明,自动拥有契约所规范的动作和行为,这就使得程序员更方便的使用面向接口的编程方式,可以使同一服务拥有不同的实现,在新旧版本升级的同时,能够使新老版本共同运行。
=================================================================
购物满100元送价值20元丝袜
【联系方式】:电话:010-&&&& QQ: &&&【产品编号】:拓普尚装&09新款夏热卖韩版女装 双层雪纺裙式上衣 T032【颜色】:白色&&【面料】:雪纺-双层
【尺寸:】:均码:胸围:无特别限制&& 衣长68& 袖长56
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31061次
排名:千里之外
原创:10篇
评论:20条
(1)(1)(1)(1)(3)(1)(1)(4)WCF数据契约(DataContract)
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所示。 [DataContract] public class UserInfo { //. } 只有声明为DataContract的类型的对象可以被传送,且只有成员属性会
    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。
  一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所示。
&&&&&&[DataContract]
&&&&&public&class&UserInfo
&&&&&&&&&&//&.
  只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。
&[DataContract]
&&&&public&class&UserInfo
&&&&&&&&[DataMember]
&&&&&&&&public&string&UserName
&&&&&&&&&&&&get;
&&&&&&&&&&&&set;
&&&&&&&&[DataMember]
&&&&&&&&public&int&Age
&&&&&&&&&&&&get;
&&&&&&&&&&&&set;
&&&&&&&&[DataMember]
&&&&&&&&public&string&Location
&&&&&&&&&&&&get;
&&&&&&&&&&&&set;
&&&&&&&&public&string&Zodiac
&&&&&&&&&&&&get;
&&&&&&&&&&&&set;
  上面这段代码把UserInfo类声明为DataContract,将UserName、Age、Location这3个属性声明为DataMember(数据成员)。Zodiac成员没有被声明为DataMember,因此在交换数据时,不会传输Zodiac的任何信息。
  DataContract也支持Name/Namespace属性,如同ServiceContract,Name和Namespace可以自定义名称和命名空间,客户端将使用自定义的名称和命名空间对DataContract类型进行访问。
  声明为DataMember的成员也可以自定义客户端可见的名称,例如:
[DataMember(Name=&Name&)]
public&string&UserName
[DataMember(Name=&Age&)]
public&int&UserAge
&&&&&&&&&&get;
&&&&&&&&&&set;
  除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。
  (1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。
  (2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依赖于成员位置的反序列化过程无比重要。
  (3)EmitDefaultvalue:为成员属性设置一个默认值。
  一般情况下,将类型声明为DataContract就可以满足传送的需求了,不过特殊情况是难以避免的,这时就需要对要传送的SOAP消息进行更加精确的控制,MessageContract可以满足这种需求。
  把一个类型声明为MessageContract,意味着它可以被序列化为SOAP消息,可以声明类型的成员为SOAP消息的各个部分,如Header、Body等,如下所示。
[MessageContract]
&&&&public&class&UserMessage
&&&&&&&&private&string&user&=&String.E
&&&&&&&&private&string&authKey&=&String.E
&&&&&&&&[MessageBodyMember(
&&&&&&&&&&Name&=&&UserName&,
&&&&&&&&&&Namespace&=&&&)]
&&&&&&&&public&string&User
&&&&&&&&&&&&get&{&return&&}
&&&&&&&&&&&&set&{&user&=&value;&}
&&&&&&&&[MessageHeader(
&&&&&&&&&&Name&=&&AuthKey&,
&&&&&&&&&&Namespace&=&&&,
&&&&&&&&&&MustUnderstand&=&true
&&&&&&&&)]
&&&&&&&&public&string&AuthKey
&&&&&&&&&&&&get&{&return&authK&}
&&&&&&&&&&&&set&{&this.authKey&=&value;&}
  User成员被声明为MessageBody(消息体)的一个成员,AuthKey被声明为消息头(MessageHeader)的一个成员。这个类将可以生成如下的SOAP消息。
&s:Envelope&
&&&&&s:Header&
&&&&&&&&&a:Action&s:mustUnderstand=&1&&http://UserMessage/Action&/a:Action&
&&&&&&&&&h:AuthKey&s:mustUnderstand=&1&&xmlns:h=&&&xxxx&/h:AuthKey&
&&&&&/s:Header&
&&&&&s:Body&
&&&&&&&&&UserMessage&xmlns=&Microsoft.WCF.Documentation&&
&&&&&&&&&&&&&&User&xmlns=&&&abcd&/User&
&&&&&&&&/UserMessage&
&&&&&/s:Body&&&&
&/s:Envelope&
  MessageHeader中,MustUnderstand参数表示读取该头的程序必须能够识别头的内容,否则不能继续处理。Name/Namespace的作用与前面的元素相同。另有Relay参数,若为true,头的内容被接收到以后会在响应消息中回发给消息发送端。
  本文来自elivsit的博客,原文地址:/zhangleong/archive//2232705.html
------分隔线----------------------------
来自 Microsoft开源项目Microsoft Health通用用户界面 通过该项目微软提供很多标准控...
在Silverlight相关技术论坛经常会看到Silverlight部署后,客户端无法更新本地XAP文件...
上一篇曾提及xaml中,每个对象元素的声明是对.NET类进行一次实例化操作。xaml作为声明...
在上几篇Silverlight Navigation导航框架教程中,主要介绍了Silverlight Navigation导...
在Silverlight实例教程 - 理解Navigation导航框架Frame类 介绍了Silverlight Navigati...
通过“Navigation导航框架开篇”的介绍,可以了解到Silverlight导航框架可被应用于多...

我要回帖

更多关于 datacontract 的文章

 

随机推荐