WCF学习总结(二)

来源:互联网 发布:群发短信软件哪个便宜 编辑:程序博客网 时间:2024/05/01 18:21

客户端和WCF服务通信的过程:

客户端通过代理调用WCF服务,代理通过服务地址找到特定的服务,调用执行特定的服务方法。

 

WCF服务元数据:

WCF服务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。服务所公开的元数据包括XSD(文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值)和WSDL文档(用于描述服务的方法、参数、参数个数、顺序、返回值、返回值的类型等方法的相关信息)。.Disco文档(描述服务的协议、地址、命名空间等信息)。

 

WCF暴露元数据的作用:

1.       WCF服务的元数据描述服务的核心信息,客户端需要了解这些特征以便与该服务进行通信。

2.       解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码,无论是c#vb还是java语。

 

WCFWeb Service比较:

两者都包括服务的本地代码文件(反序列化生成的本地服务相关代码),WSDL服务描述文件、XSD服务结构文件。WCF框架模型一定程度上参考了以前的ASP.NET Web Service,并对此进行了扩展。

 

WCF服务元数据交换方式介绍:

1.       基于HTTP-GET协议提供元数据: HTTP/GET请求。

2.       MEX元数据交换终结点:元数据交换终结点与其它终结点相似,包含自己的地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract),但是使用的服务契约为WCF提供的接口IMetadataExchangeWS-MetadataExchange(MEXWCF支持的基本绑定HTTPHTTPSTCPIPC等绑定协议)

 

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]

}