客户端和WCF服务通信的过程:
客户端通过代理调用WCF服务,代理通过服务地址找到特定的服务,调用执行特定的服务方法。
WCF服务元数据:
WCF服务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。服务所公开的元数据包括XSD(文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值)和WSDL文档(用于描述服务的方法、参数、参数个数、顺序、返回值、返回值的类型等方法的相关信息)。.Disco文档(描述服务的协议、地址、命名空间等信息)。
WCF暴露元数据的作用:
1. WCF服务的元数据描述服务的核心信息,客户端需要了解这些特征以便与该服务进行通信。
2. 解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码,无论是c#,vb还是java语。
WCF和Web Service比较:
两者都包括服务的本地代码文件(反序列化生成的本地服务相关代码),WSDL服务描述文件、XSD服务结构文件。WCF框架模型一定程度上参考了以前的ASP.NET Web Service,并对此进行了扩展。
WCF服务元数据交换方式介绍:
1. 基于HTTP-GET协议提供元数据: HTTP/GET请求。
2. MEX元数据交换终结点:元数据交换终结点与其它终结点相似,包含自己的地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract),但是使用的服务契约为WCF提供的接口IMetadataExchange。WS-MetadataExchange(MEX:WCF支持的基本绑定HTTP、HTTPS、TCP、IPC等绑定协议)。
WCF服务契约的设计:
比如有个汽车服务契约,其中包含跑(run),拉东西(carry),拉人(take)。那么我们在设计的时候如果只做一个接口比如:
[ServiceContract]
interface IVehicle
{
//操作契约,跑,开的契约
[OperationContract]
string Run();
//操作契约,拉人、载人的契约
[OperationContract]
string Take();
//操作契约,运输货物的契约
[OperationContract]
string Carry();
}
这就违反了接口设计中的主要的原则ISP接口隔离原则。我们不应该强迫服务继承他们不需要的操作。接口隔离原则ISP:使用多个专门的接口比使用单一的接口要好。从服务设计的角度来说:一个类对另外一个类的依赖性应当是建立在最小的接口上的。如果服务类只需要某一些方法的话,那么就应服务类可以继承相应的接口实现这些需要的方法,而不要实现不需要的方法。修改后如下:
//契约属性不支持继承,如果需要继承契约属性,接口标志契约属性,定义一个交通工具基接口契约
[ServiceContract]
interface IVehicle
{
//操作契约,跑,开的契约
[OperationContract]
tring Run();
}
//接口继承关系不支持ServiceContract继承
[ServiceContract]
interface ITruck : IVehicle
{
//操作契约,运输货物的契约
[OperationContract]
string Carry();
}
//接口继承关系不支持ServiceContract继承
[ServiceContract]
interface ICar : IVehicle
{
//操作契约,拉人、载人的契约
[OperationContract]
}