一、契约
任何一个分布式应用程序,都会事先制定好数据交换规则,这个规则正是交换数据的双方(比如服务器端和客户端)能彼此理解对方的依据。在WCF中称之为契约(Contract)。
1.契约的分类
1)用于定义服务操作的服务契约:Service Contract
这种级别的契约又包括两种:ServiceContract和OperationContract。
ServiceContract用于类或结构上,用于指示WCF此类或者结构能够被远程调用。
OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
2)用于自定义数据结构的数据契约:Data Contract
数据契约也分为两种:DataContract和DataMember。
DataContract用于类或者结构上,指示WCF此类或者结构能够被序列化并传输。
DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或字段能够被序列化并传输。
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
3)用于自定错误异常的异常契约:Fault Contract
默认情况下,当服务器端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息。此时,我们可以自定义异常信息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。
public interface IService1
{
[OperationContract]
[FaultContract(typeof(OverflowException))]
string GetData(int value);
[OperationContract]
[FaultContract(typeof(OverflowException))]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
4)用于控制消息格式的消息契约:Message Contract
能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。
public class MyMessage
{
string key;
CompositeType composite;
[MessageHeader]
public string key
{
get { return key; }
set { key = value; }
}
[MessageBodyMember]
public CompositeType Composite
{
get { return composite; }
set { composite = value; }
}
}
2.契约独立于平台
它只约束通讯的双方应该遵守什么样的规则,而丝毫不管双方各自采用的是什么样的技术和什么样的操作系统。
二、 Address
Address通过一个Uri来唯一标示一个WCF的终节点(EndPoint)的,它标示了消息发送的目的地。
1.Address的组成
Address在WCF中用System.ServiceModel.EndpoingAddress对象来表示的,它的结构如下:
2.在配置文件中指定Address
在配置文件中,有两种方式可以指定Address,一种是绝对地址方式,另一种是相对地址方式。
3.通过编程方式设置Address
三、Binding
Endpoing包括三个组成部分:1.Address 2.Binding 3.Contract
Address解决了Endpoint在哪的问题。
Binding解决的是如何与Endpoint通讯的问题。
Contract解决了Endpoint提供什么功能的问题。
Binding实现的是客户端和服务端进行通讯的底层细节,包括数据如何传输(比如采用TCP,HTTP等),如何解决安全问题(SSL、Message Level Security等),传输的消息的格式(如text/xml、MTOM、binary等)。
1.Binding的组成
Binding包括三个组成部分:NameSpace、Name和BindingElement。
Name和NameSpace是服务元数据(meta data)的唯一标志,二者就像Binding的姓名一样,而BindingElement则描述Binding的特征,我们说Binding能解决通讯方式的问题,关键是靠BindingElement来进行描述。
2.BindingElement的分类
BindingElement分为三种类型:
1)EncodingBindingElement:它用于描述传输数据的编码方式,比如用text/xml进行编码,用binary编码,用MTOM进行编码都是在这个上面定义,每个BindingElement必须包含一个EncodingBindingElement。
2)TransportBindingElement:它用于描述数据的传输方式,例如使用tcp进行传输,还是用http进行传输,还是用msmq,这些都是由TransportBindingElement来定义,每个BindingElement必须包含一个TransportBindingElement。
3)ProtocolBindingElement:指定诸如安全性、可靠性、上下文流设置(context flow settings)。
3.Binding描述哪些层面的信息
4.选择正确的Binding