wcf

一,.net通信技术的比较

.net remoting它使用面向对象的方式,在.net Remoting中,.net对象可以跨应用程序域来使用,包括在网络上使用对象,这种使用对象的方式缺点是,类型是共享的,这不仅很难使用不同的平台,而且很难再开发远程对象的新版本时,使客户机和服务器保持联系----远程对象程序集的新版本必须发布到客户机上,客户系统往往需要远程对象的程序集,从基类MarshalByRefObject中派生远程对象类并不是最佳设计方案,因为不能从另一个类中派生它,.net Remoting中添加了安全性,但.net 2.0也提供了安全性,这个技术的真正价值在于它的可定制性,可以使用其他传输协议替换信道,开发部同的格式化器,以及使用消息接收池扩展调用流。

 

DCOM是Enterprise Services用于在线上传输信息的协议,DCOM是一个非常快的协议,但不能用定制的拦截机扩展它,要使用DCOM,必须再客户机和服务器上都使用Micsoft技术,且必须再客户系统上安装代理程序,Enterprise Services很容易在服务器端使用事务处理,对象池等服务,利用这项技术,可以把属性用于定义所服务组件的要求,由于在大型解决方案中,客户代理的安装常常不太容易,所以把web服务用作前端。

 

web服务部仅可以在不同的平台上使用客户机和服务器,还可以定义一个wsdl契约,提前计划版本的改变,不使已有的客户机和服务器崩溃,web服务的问题是使用http协议,用soap协议进行xml串行化的速度不够快,一些扩展功能很难使用,在客户机和服务器之间唯一共享的是一个清晰地契约,除此之外,asp.net web服务可以很容易使用属性来开发,不需要继承特定的基类。

 

二,web服务

web服务的要求在不断变化,安全性,可靠性,事务处理,性能。

 

安全性:消息验证,WS-Security规范定义,可以使用soap请求传送安全标记;WS-SecureConversation规范定义了消息如何以安全的方式传递。

 

保证消息可靠性的机制,WS-ReliableMessaging规范定义了一个交互操作协议,可用于确保消息的传送。

序列:在消息从源发送到目的地时,使用一个唯一的标识符来定义一个消息序列,一个序列可以包含几个消息;消息编号:序列中的消息要编号,每个消息在序列中有一个唯一的号码,消息号和消息一起发送,这样接收程序就知道何时接收到了序列中的所有消息,若接收到的消息没有按照顺序排列,客户机还可以高速缓存它们,给它们重新排序;确认:发送确认消息是为了说明成功接收到了消息,为了提高性能,确认消息用确认范围来发送,为了提高性能,接收程序还可以发送负面确认消息(NACK),而不是ACK,表示必须再次发送消息。

 

可靠消息传递流程图:

 

三,事务处理
有3个规范把事务处理引入Web服务,WS-Coordination,WS-AtomicTransactions和WS-BusinessActivity,WS-Coordination是一个基本规范,其他规范在它的基础上进行扩展。
WS-Coordination定义了协调分布式应用程序的操作的框架,这个规范可以协调多个web服务,例如协调事务处理和跨步同web服务的工作流管理。
WS-AtomicTransactions规范是对WS-Coordination规范的扩展,支持类似数据库开发的原子事务处理。
协调程序给所有参与的web服务发送一个Prepare消息,如果事务处理正常,所有的参与者就必须用一个Prepared消息响应,接着协调程序发送一个Commit消息,所有的参与者都必须提交这个消息;万一参与者不能成功完成事务处理,就把Aborted消息发送给协调程序,接着,协调程序给其他的参与者发送Rollback消息。
WS-AtomicTransactions不应在公司边界上使用,因为这种事务处理会锁定所使用的资源,它只适合没有用户操作的短期事务。
对于有用户操作和其他业务的长期事务,应使用WS-BusinessActivity规范,在这个规范中,不会锁定资源,业务操作也可以持续较长时间,事务处理不是提交或中止,而是可以补偿操作,如果一个参与者没有成功完成事务处理,就发送一个Compensate消息,所有的参与者都可以撤销它们的操作。
四,性能
soap不在依赖http协议,由于soap基于xml信息,而不是xml结构化信息项,所以可以创建较小的网络包,于是就有了二进制soap变体,它可以传送较少的数据。
udp协议不能保证消息的传送,消息包很容易丢失,这个协议的优点是,可以一次把消息传送给多个接收器,而无需与每个接收器通信,看看SOAP-over-UDP规范的公司,在这个规范中,定义了如下消息摩斯和:
单播单向:单播单向消息发送给一个节点,且不发送响应消息。
多播单向:多播单向消息发送给一组节点,且不发送响应消息。
单播请求,单播响应:消息发送给一个节点,且发送响应消息。
多播请求,单播响应:请求发送给一组节点,接收到请求的每个节点都用一个响应消息作为回应,响应不必是多播的,因为每个接收器都给所有的节点发送响应,很容易使网络达到饱和,当然,在多播组中,源发送者可以接收来自每个节点的多个响应消息。
五,wcf摡序
1,驻留组件和服务:可以把wcf服务放在asp.net运行库中,windows服务上,com+过程中,或windows窗体应用程序上,进行对等计算。
2,声明性操作:不是必须从基类中派生,可以使用属性定义服务,这类似于asp.net开发的web服务。
3,通信信道:.net remoting在改变通信信道方面灵活,wcf可以使用http,tcp或ipc信道进行通信,也许还可以使用udp信道。
4,安全体系结构:要实现独立于平台的web服务,必须使用标准化的安全环境,wcf中继续使用wse2.0
5,可扩展性:.net remoting有丰富的扩展功能,它不仅可以创建定制的信道,格式化器和代理程序,还可以在客户机和服务器的消息流中插入功能,wcf提供了类似的可扩展性,但这些扩展功能是使用soap标题实现的。
6,对当前技术的支持:要使用wcf,根本不需要重写分布式解决方案,wcf可以与已有的技术集成,wcf提供的一个信道可以使用DCOM与所服务的组件通信,用asp.net开发的web服务也可以集成。
wcf有一个非常灵活的分层体系结构,分布式应用程序可以使用高级api或低级api编写,高级api或服务层可以用于调用方法和事件,服务层把这些高级的抽象代码转换为消息,以使用低级api上的信道和端口。
wcf应用程序的各个层,该应用程序可以使用消息传送服务,如排队,路由,引发事件和发现服务,为分布式应用程序提供的服务内容有自动事务处理,并行管理,错误处理和实例创建,消息传递块分为两个区域:一是传输信道,这是连接传输协议的适配器;二是信道,它添加了安全性,可靠性和引发事件等功能,传输信道可以和其他信道合并。wcf可以放在任意应用程序类型上。
消息传递的方式:
1,自带寻址信息的传送方式:自带寻址信息的消息以“发送后删除”的方式传送,消息传送出去后,接收程序不会发出回应,发送程序不需要等待接收程序的回应,当然,在这种操作中,方法只有输入参数。
2,请求-回应传送方式:这种方式最常用,发送程序给接收程序发送一个请求消息,接收程序返回一个回应消息。
3,双向传递方式:在这种方式中,网络的两端都发送和接收消息。
六,用wcf编程
1,契约
契约定义了服务程序提供的功能以及客户程序可以使用的功能,契约完全独立于服务程序的实现,web服务的契约是wsdl,在asp.net中,契约是通过用web服务方法指定属性来隐式实现的,当然,也可以使用Thinktecture的WSCF等工具显示地设计契约。
wcf比较注重契约的设计,定义了3种不同类型的契约:服务契约,数据契约和消息契约,使用.net属性可以指定契约。
服务契约:用于定义描述服务的wsdl,这个契约是用接口或类定义的。
数据契约:定义了从服务接收和返回的数据,用于发送和接收消息的类有相关的数据契约属性。
消息契约:如果需要对soap消息进行全面的控制,消息契约就可以指定哪些数据应放在soap标题中,哪些数据应放在soap消息体重。
a,服务契约
 定义了服务程序可以执行的操作,[ServiceContract]属性和接口或类一起使用,来定义服务契约,服务提供的方法包括[OperationContract]属性,它应用于ICourseRegistration服务。例如:
[ServiceContract]
public interface ICourseRegistration
{
  [OperationContract]
  public bool RegisterForCourse(Course course,Attendee attendee);
}
b,数据契约
有了数据契约,可以把clr类型映射为xml模式
数据契约与其他串行化机制不同;运行库的串行化,会串行化所有的字段,而xml串行化只对公共字段和属性执行,数据契约要求用[DataMember]属性对要串行化的字段进行显示标记,无论字段是私有的还是公共的,都可以使用这个属性。
数据契约支持版本转换,通过指定的VersionAdded属性,可以指定额外的元素,添加较新的版本,IsOptional属性指定仍接收契约早期版本中的消息。
例如:
[DataContract]
public class Course
{
  [DataMember] public string Number;
  [DataMember] public string Title;
 
  [DataMember(VersionAdded=2 IsOptional=true)]
  public string LocationCode;
}
为了保持平台和版本的独立性,使用数据契约是确定应发送哪些数据的最佳方式,也可以使用xml串行化和运行库串行化,xml串行化是asp.net web服务使用的机制,.net Remoting则使用运行库串行化。
c,消息契约
如果需要对soap消息进行全面的控制,就要使用消息契约,在消息契约中,可以指定消息的哪些部分放在soap标题中,哪些部分放在soap消息体重,消息契约[MessageContract]属性指定,soap消息的标题和消息体[MessageHeader]和[MessageBody]属性指定,通过Position属性可以定义消息体重的元素的顺序。
[MessageContract]
public class ProcessPersonRequestMessage
{
  [MessageHeader]
  public int employee;
 
  [MessageBody(Position=0)]
  public Person person;
}
类ProcessPersonRequestMessage和服务契约一起使用,该服务契约用IProcessPerson接口定义:
[ServiceContract]
public interface IProcessPerson
{
  [OperationContract]
  public PersonResponseMessage ProcessPerson(ProcessPersonRequestMessage message);
}
2,服务程序的实实现
服务程序的实现用属性[ServiceBehavior]来标记。
[ServiceBehavior]
public class CourseRegistrationService:ICourseRegistration
{
  public bool RegisterForCourse(Course course,Attendee attendee){}
}
属性[ServiceBehavior]用于描述wcf服务提供的操作,来截取所需功能的代码。
3,绑定
绑定描述了服务希望的通信方式,在绑定过程中,可以指定如下特性:传输协议,安全要求,编码格式,事务处理要求。
除了定义绑定之外,服务程序还必须定义端点,端点依赖于契约,服务的地址和绑定。
除了编程定义绑定之外ia,可以用应用程序配置文件定义它,wcf的配置放在元素<system.serviceModel>中,<service>元素定义了所提供的服务,服务需要一个端点,该端点包含地址,绑定和契约信息。
4,主机
wcf在选择运行服务的主机方面很灵活,主机可以是一个windows服务,com+应用,asp.net,windows应用程序或简单的控制台应用程序。
下例中演示了位于控制台应用程序中的服务的主机程序。创建了一个ServiceHost<>实例,之后读取应用程序配置文件,来定义绑定,还可以编程定义绑定,接着调用ServiceHost<>类的Open()方法,让服务接受客户调用,在控制台应用程序中,一定要关闭服务后子啊关闭主线程。
using(ServiceHost<CourseRegistrationService> serviceHost=new ServiceHost<CourseRegistrationService>())
{
 serviceHost.Open();
 serviceHost.Close();
}
若果在windows窗体应用程序中启动服务,而服务代码调用了windows窗体控件,就必须注意,只有控件的创建线程访问该控件的方法和属性,在wcf中,设置[ServiceBehavior]属性的RunOnUIThread特性。
5,客户程序
客户程序需要一个代理才能访问服务,为客户程序创建代理有两种方式:
Svcutil.exe:可以用SvcUtil实用工具创建代理类,这个工具从服务中读取元数据,来创建代理类。
ChannelFactory类:这个类由Svcutil中生成的代理使用,它也可以用于编程创建代理。静态方法CreateChannel()该方法是在构造函数中调用的,CreateChannel()方法返回一个信道对象,该对象通过地址和绑定信息实现需要的服务契约。
七,使用wcf
.net remoting的主要特性事,可以把任意应用程序用作主机,其二进制格式化器比使用web服务进行通信要快,而且对象可以是有状态的,也可以是无状态的,wcf支持任意主机,使用NetProfileXXX绑定,通信速度会很快。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值