WCF学习记录

由浅入深,循序渐进,对WCF有个整体的了解。原文地址 https://blog.csdn.net/songyefei/article/category/1101850
学习过程总结:
一.WCF 程序最基本的编程步骤
(1) 定义服务协定接口和接口中的操作协定。
(2) 用一个服务类实现服务协定接口和接口中的操作协定。
(3) 建立一个宿主程序用来寄存服务。
[针对控制台程序宿主]
(4) 为服务建立ServiceHost 对象并指定要寄存的服务类和服务基地址。
(5) 为ServiceHost 添加终结点,指定其服务协定、绑定类型和终结点地址(或相对地址)。
(6) 为ServiceHost 添加服务元数据行为对象,要将该对象的HttpGetEnabled属性设为true 以启动元数据交换。
(7) 启动ServiceHost。
(8) 建立客户端。
(9) 为客户端添加指向服务基地址的服务引用以下载元数据。
简而言之
(1) 定义服务协定。
(2) 实现服务协定。
(3) 配置和建立宿主。
(4) 配置和建立客户端。
(5) 调用服务。

二.WCF的编程中配置占了很大的比重

(1) 依据服务实现类配置一个服务(ServiceHost)。
(2) 指定一个基地址(如果终结点中指定了绝对地址,这步可以省略)。
(3) 建立一个终结点,并为其指定地址、绑定和服务协定。
(4) 建立一个元数据交换终结点。
(5) 为服务添加一个行为来启用元数据交换。

三.ClientBase 代理类

ClientBase<>类也是一个泛型类,接受服务协定作为泛型参数,与ChannelFactory<>不同的是,这个类是一个基类,即抽象类,是不能实例化成对象直接使用的,我们需要自己写一个类来继承这个类,我们新写的类实例化出来就是客户端代理了,这个对象可以调用基类的一些受保护的方法来实现通信。ClientBase<>为我们封装的很好,我们只需要写个新类来继承他就可以了,通信的很多部分他都替我们做好了,比如我们不用进行去创建通道和打开通道的操作,直接调用协定方法就可以了。这也是服务引用和其他元数据生成工具(如svcutil)使用这个类来构造客户端代理的原因。

四.元数据交换

元数据包括了要和服务端进行通信的所有信息,包括服务协定接口、服务端终结点地址、绑定等信息,它指出了客户端应该到何处去寻找服务以及怎样调用服务的一切线索。
服务端是怎样公布其元数据的呢?答案是使用WSDL文件,WSDL即Web Service Description Language,Web服务描述语言,它是一个XML文件,在这个文件中按照一定的标准来对Web Service进行描述,他是符合W3C标准的,因为WCF是被设计为供不同平台调用的服务框架,所以客户端可能是非微软平台的,比如Java什么的。因此WCF必须使用WSDL这种国际标准的描述方法来描述服务才能被众多的平台所访问。
在WCF服务端的运行时,有一组类库随时待命把服务的元数据输出为WSDL描述提供给请求者,只要有客户端按照服务端约定的方法来请求元数据,服务端立即将服务运行时状态写成WSDL文件提供。客户端得到的实际上就是WSDL文件(还有一些框架描述文件XSD),客户端拿到文件后再使用自己的方法来解读WSDL,把他翻译成客户端可用的源代码或配置文件,这时客户端就得到了服务的编程模型,通过一些代理类,客户端甚至可以像调用本地对象一样使用WCF服务。
因此整个过程是这样:客户端向服务端请求元数据交换–>服务端运行时将元数据编写成WSDL文件提供–>客户端获得文件–>客户端翻译文件–>客户端根据翻译结果生成本地类代码和配置–>客户端获得服务的本地编程模型

五.会话

会话是通信双方进行通信的一个时间片、一个语境或者说一个上下文。在这个特定的环境中,通信的双方是彼此认识的,就像两个人在聊天,他们都很清楚谁在聆听自己讲话,也很清楚对方讲的话是给自己听的,简单的说就是通信双方是可以记住彼此的。
这个特性是很有用的,有些逻辑需要客户端和服务端通信多次才能完成,在这个期间双方需要记住彼此,而且会话也是很多其他特性实现的基础,例如双工通信。
如何建立会话?
1.需要支持会话的绑定(basicHttpBinding是不支持会话的,而wsHttpBinding就是支持的)
2.让服务协定支持会话
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IHelloWCF
{
[OperationContract]
string HelloWCF();
}
SessionMode有三个可能的值:

  1. Allowed:这是默认值,表示这个服务协定是允许会话的,客户端可以选择用会话连接,也可以选择不用会话连接。
  2. Required:表示服务协定要求客户端连接必须使用会话。
  3. NotAllowed:表示服务协定不允许使用会话连接。
    六.实例化
    当客户端调用服务端服务方法时,服务端如何对服务类进行实例化?服务端实例化的方式有三种,分别是"每调用实例",“每会话实例"和"单一实例”
    配置服务行为(不是协定行为):
    每调用实例: [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    每会话实例: [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    单一实例: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

七.消息通信模式

WCF的服务端与客户端在通信时有三种模式:单向模式、请求/应答模式和双工模式。

单向模式:调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈。 [OperationContract(IsOneWay=true)]
请求/应答模式:客户端向服务端发出调用后会一直等待服务端的回复,服务端在执行完操作后会把结果返回给客户端。 [OperationContract(IsOneWay=false)]默认
双工模式:客户端和服务端都可以单独的向对方发送消息调用。

八.双工模式

(1) 通信两端都有两个协定接口,接口的实现在两边一边一个。

(2) 支持双工的绑定。

(3) 指定服务协定的回调协定以建立回调联系。

(4) 客户端自己构造运行时服务类对象和实例上下文对象。

(5) 服务端通过操作上下文获得回调通道 。

(6) 需要会话的支持。

(7) 两个协定中的协定操作应为单向模式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值