博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF 第二章 契约 数据契约
阅读量:6668 次
发布时间:2019-06-25

本文共 3915 字,大约阅读时间需要 13 分钟。

在一个服务内部,功能性的应用由代码实现的。在服务外部, 功能性服务在WSDL中定义。在一个WCF服务中,应用程序数据在简单和复杂类型表示;而在服务外部,应用程序数据由XML元数据定义表示。WCF数据契 约提供了对代码定义的.NET CLR类型与W3C组织定义用来在服务外部通信的XML元数据定义之间的映射。
使用WCF,开发人员花费更多的时间在代码和接口语义上,在XSD和WSDL语法上花费的时间会更少。那不是说XSD和WSDL语法不重要;它 们是跨平台系统上进行互操作必要前提。但是编译器也显示出了在把由.NET 语言生成的数据结构翻译为跨平台的具有互操作性的XSD和WSDL表示的优势。
在设计阶段,[DataContract]属性用来表示哪个类应该以XSD形式表示而且被服务在WSDL中暴露。[DataMember]属性 进一步定义XSD中哪一个类的成员应该包含在外部表示中。运行时,DataContractSerializer 类使用[DataContract]和[DataMember]规则把对象序列化成XML。图片2.7显示了将一个.NET实现用可以与其他系统实现互操 作的XML元数据表示。
图片2.8也显示了在2.7中描述的同样翻译,同时为了区分也显示了C#和XSD的语法。
DataContractSerializer 讲序列化类型并在WSDL契约中暴露它们,如果它们满足以下条件:
1. 标记[DataContract]和[DataMember]属性的类型
2. 标记[CollectionDataContract]的类型
3. 继承自IXmlSerializable 的类型
4. 标记[Serializable]的类型,成员没有使用[NonSerializable]标记
5. 标记[Serializable]的类型而且实现了ISerializable接口
6. 内建CLR初始类型,比如int32和string
7. Bytes数组, DataTime,TimeSpan,Guid,Uri,XmlQualifiedName,XmlElement和XmlNode
8. 数组和集合,比如List<T>, Dictionary<K,V>和Hashtable
9. 枚举
为一个.NET类定义XML元数据
[DataContract]属性,在System.Runtime.Serialization中定义,说明一个类应该在描述服务的WSDL 中以XSD暴露出来。如果一个类没有[DataContract]属性,它将不会出现在WSDL中。默认的,XML元数据的名字与类的名字和元数据中的目 标命名空间是一样的: (由.NET命名空间描述)。这两个都可以被重载。你可能想重载它们来控制在服务外部暴露的名字。比如,regOrder的一个内部类名可以在XSD中以Order暴露出来。列表2.16显示如果重载XSD的名字和命名空间。
[DataMember]属性,也定义在System.Runtime.Serialization, 确定将以[DataContract]属性定义的成员包含在XML元数据中。如果一个类的成员没有使用[DataMember]来定义属性,就不会包含在 XML元数据中,尽管它是类的成员。默认的,类成员不包含在XML元数据定义中,这是一种选择模型。.NET类成员的范围,无论是公共的还是私有的,不影 响它是否包含在XML元数据中; 决定是由[DataMember]来严格限定的。
列表2.15演示了一个类定义,StockPrice,有5哥公共数据成员。其中三个,ticker, theCurrentPrice和theCurrentTime是必须的,因为它们使用isRequired=true标记。一些额外的 [DataMember]特性在以下显示:
类成员名字在代码中都使用m_前缀。类成员名字被重载以便于m_notation不用引入服务接口定义的XSD中。
类成员的顺序由[DataMember]属性定义。如果顺序没有确定,元素将会在XSD中按字母顺序排列。顺序一般是不重要的,但是控制顺序对互操作来说很重要。如果你在发送消息给一个期待在特定方式接收顺序消息的服务,这个属性可以控制编码到XML文本中的元素顺序。
类成员m_CurrentPrice, m_CurrentType和m_ticker标记为必须的,但是m_dailyVolume和m_dailyChange不是。非必须存在的类成员可以在XML实例中被忽略而且根据XSD它们仍然被认为是合法的。
 
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Runtime.Serialization;
using
System.ServiceModel;
namespace
EssentialWCF
{
[DataContract(Namespace
=
"
http://EssentialWCF
"
,
Name
=
"
StockPrice
"
)]
public
class
clsStockPrice
{
[DataMember(Name
=
"
CurrentPrice
"
,
Order
=
0
, IsRequired
=
true
)]
public
double
theCurrentPriceNow;
[DataMember(Name
=
"
CurrentTime
"
,
Order
=
1
, IsRequired
=
true
)]
public
DateTime theCurrentTimeNow;
[DataMember(Name
=
"
Ticker
"
,
Order
=
2
, IsRequired
=
true
)]
public
string
theTickerSymbol;
[DataMember(Name
=
"
DailyVolume
"
,
Order
=
3
, IsRequired
=
false
)]
public
long
theDailyVolumeSoFar;
[DataMember(Name
=
"
DailyChange
"
,
Order
=
4
, IsRequired
=
false
)]
public
double
theDailyChangeSoFar;
}
[ServiceContract]
public
class
StockService
{
[OperationContract]
private
clsStockPrice GetPrice(
string
ticker)
{
clsStockPrice s
=
new
clsStockPrice();
s.theTickerSymbol
=
ticker;
s.theCurrentPriceNow
=
100.00
;
s.theCurrentTimeNow
=
DateTime.Now;
s.theDailyChangeSoFar
=
.
012345
;
s.theDailyVolumeSoFar
=
450000
;
return
s;
}
}
}
Svcutil.exe –t:metadata 命令使用类中定义的[DataMember]元素生成XSD。列表2.16显示了列表2.15中的代码生成的XSD。注意元素名和顺序是根据代码中属性定 义的。同时也要注意非必须类成员在XML元数据中定义成minOccurs=0.
 
<?
xml version="1.0" encoding="utf-8"
?>
<
xs:schema
xmlns:tns
=
elem
entFormDefault
="qualified"
targetNamespace
=
xmlns:xs
="http://www.w3.org/2001/XMLSchema"
>
<
xs:complexType
name
="StockPrice"
>
<
xs:sequence
>
<
xs:element
name
="CurrentPrice"
type
="xs:double"
/>
<
xs:element
name
="CurrentTime"
type
="xs:dateTime"
/>
<
xs:element
name
="Ticker"
nillable
="true"
type
="xs:string"
/>
<
xs:element
minOccurs
="0"
name
="DailyVolume"
type
="xs:long"
/>
<
xs:element
minOccurs
="0"
name
="DailyChange"
type
="xs:double"
/>
</
xs:sequence
>
</
xs:complexType
>
<
xs:element
name
="StockPrice"
nillable
="true"
type
="tns:StockPrice"
/>
</
xs:schema
>

===========

转载自

作者:
出处:
 

转载于:https://www.cnblogs.com/llbofchina/archive/2011/06/27/2091381.html

你可能感兴趣的文章
您需要来自administrators的权限才能对此文件进行更改
查看>>
博客园客户端UAP开发随笔--自定义控件的左膀右臂
查看>>
Sqlserver事务发布实现数据同步
查看>>
各类nosql db的功能与性能对比
查看>>
IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
查看>>
怎样区分直连串口线和交叉串口线?
查看>>
ThinkPHP3.1快速入门(13)自动完成
查看>>
搭建Android开发环境之——Android4.0.3, 4.1, 4.2, 4.3, 4.x,及升级 ADT(22.0.5)和SDK(22.x)...
查看>>
【Javascript】—— 1 方法function的高级特性
查看>>
Android中的颜色设置
查看>>
ios iphone 将log在终端输出
查看>>
Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展
查看>>
优秀团队建设--美国式团队(ppt)
查看>>
HTML5 ArrayBuffer:类型化数组 (二)
查看>>
tail 命令(转)
查看>>
Linux中zip压缩和unzip解压缩命令详解
查看>>
DevExpress学习03——label控件的背景色问题
查看>>
微信全球MBA创新大赛麻省理工学院的WeChat Care团队夺魁
查看>>
properties 中文乱码问题的解决
查看>>
2015第15周一
查看>>