学习了一段时间的WCF,也抄了些例子,但是发现就这样的话还是有些模糊,从今天开始把自己看过的一些东西重新整理一下,理一下思路。
WCF是基于SOA编程的一套架构。它集成了.net service,Remotting,消息队列和Enterprise Service等技术。实现了跨平台,跨系统,跨本地网络和internet的操作。目的是收发从客户机到服务的消息。
(1)消息队列(MSMQ)可以创建消息队列,使进程之间互相通信而忽略掉通信双方。通信各方只是单纯的向消息队列中存放消息和从消息队列中取出消息,进而在没有联网的情况下也可以实现消息的交换。
(2)web service 发布于uri的一套应用程序,向外界暴露一个用于调用的API。基于xml,xsd,soap,uddi的开发手段。
(3).net remotting:跨越应用程序池实现进程间对象访问的机制。remoting基于通道(TCP和HTTP),获得服务端对象,然后通过proxy解析为本地客户端对象。通过通道创建客户端对象成为激活,remoting有两种激活方式,服务端激活和客户端激活。服务端激活又包括sigleton和sigleCall模式。
(4)soap。现在的soap是一个XML表示的消息体。包含封套,封套包含标题和消息体。
(5)WSDL webservice description language ,描述服务的操作和消息。
(6)JSON Javescript object notation 。适用于ajax客户机。
上面列出了一些WCF的附属技术。下面来看下WCF的几大要素:
《1》 合同 contract
contract 分为三种,一种为data contract 一种是 service contract 一种是message contract。他们定义了服务提供的功能和客户端程序可以使用的功能。contract完全独立于服务的实现代码。
1,data contract 定义了服务中传输和接受的数据。可以是一个类。
data contract 最好定义一个namespace,因为data contract 存在一个版本问题,如果添加一个可选成员,则不会破坏版本。如果增加或者删除了需要字段,则contract会被破坏。
2,service contract 定义描述了服务的WSDL,用接口或类定义。
3,message contract 如果需要完全控制soap,可以使用message contract,它可以指定哪些部分放在soap标题中,哪些放到body中。
《2》服务的实现 标记为[seveice behavior] sessionMode.Requirst InstanceContextMode.Persession
1, 如果需要会话的话,则不能使用basicHttpBinding 。
2,客户端使用实现的服务可以使用两种方式;一种是webservice的引用,另一种是使用ChannelFactory<Tchannel>.CreatChannel实例化连接服务的信道。
3,错误处理,可以写一个错误类[data contract] 定义错误数据类,使用[Fault contract]属性
《3》绑定 服务的通信方式 常用的有basicHttpBinding WSHttpBinding,WebHttpBinding,NetTcpBinding........
endpoint : address(uri) contract binding .
《4》主机 host 即运行服务的主机,可以是windows服务,可以是com+应用,可以是WAS和IIS,wuindows应用程序,或简单控制台程序。
1,定制主机 使用ServiceHost实例,读取配置文件,定义绑定。然后open开接受调用,注意一点,主线程推出前需close掉host。查看host属性可使用communicationState。
2,WAS主机,可以自动激活服务,健康监控和循环处理。使用WAS主机,需要创建一个web站点和.SVS文件。
《5》客户程序:客户应用程序需要使用代理来访问服务,创建代理有三种方法,一是添加web应用。二是使用Svcutil.exe工具创建。三是使用channelFactory类。
《6》双向通信 使用callback实现服务器回调客户端代码,实现双向通信。
1,使用isoneway=true 保证服务不必等待方法在客户程序上成功调用。
2,为了避免出现死锁现象,使用concurrentcyMode.multiple或ConcuurentcyMode.Reentrant。访问callback contract 要使用OperationContext访问会话信息、消息标题和属性。在双向通信时还可以访问回调信道。通过泛型方法GetCallBackChannel()将信道返回客户实例,调用callback实现方法。
3,在双向通信中要使用DuplexChannelFactory类。这个类接收三个参数,分别是绑定,uri和封装了ClientCallBack类的一个InstanceContext类。