契约
契约定义了程序中的终结点,终结点使用的消息交换模式和终结点处理的消息结构。
WCF里定义了三种契约类型:服务契约、数据契约和消息契约。服务契约描述了终结点的操作。描述包含名称、消息交换模式、会话规范信息、请求和响应的消息头、每个操作的安全信息。数据契约是映射消息体到一个或多个操作。消息契约映射消息和消息头到一个或多个操作。
服务契约
服务契约是一个被ServiceContractAttribute或OperationAttribute属性标记的类或接口。ServiceContractAttribute可以使用在类和接口上,而OperationContractAttribute只能用在方法上。绝大部分标记了OperationContractAttribute的类型成员都会被ServiceContractAttribute标记。
数据契约
数据契约映射.Net Framework类型到消息体。数据契约使用的属性是DatatContractAttribute和DataMemberAttribute。
// Use a data contract as illustrated in the sample below to add composite types to service operations
[DataContract]
public class CompositeType
{
string stringValue = "Hello ";
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
消息契约
消息契约映射.NetFramework类型到消息架构上。如果XML是消息的结构,那么契约会映射.NET Framework类型到消息的schema上。这包含消息头和消息体。
[ServiceContract]
interface IService1
{
[OperationContract]
void GetData(MessageType message); //Param is message type
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
string stringValue = "Hello ";
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
[MessageContract]
sealed class MessageType
{
[MessageHeader]
int? statusCode;
[MessageBodyMember]
CompositeType messageBody;
internal MessageType(Int32 statusCode)
{
this.statusCode = statusCode;
this.messageBody = new CompositeType();
}
}
4.3 从内部剖析WCF
WCF主要有两个架构层的基础结构。这两个层次的名字分别为服务模型层(ServiceModel layer)和通道层(Channel layer)。 服务模型层是用户代码和通道层之间的桥梁。通道层是做了真正的消息相关的工作,是了解特定传输方式和WS-×消息编排的层。
服务模型层调用发送者上的代理(Proxy,也被称为Client)和接收者上的分发器(Dispatcher)有不同的作用,尽管它们是相同架构层的不同部分。代理负责创建消息,并发送给通道层。分发器负责反序列化接收到的消息,实例化对象并分发反序列化的消息内容到此对象。
在消息接收者上,地址告诉通道侦听请求消息的地址。在发送者上,地址告诉通道消息接收者的地址。
绑定,就是创建通道层的工厂对象的集合。
契约是消息序列化和反序列化使用的,它们同样会来确定接收程序的消息交换模式。