18.2 WCF基础

  在了解了WCF的概念和通信原理,以及为什么要使用WCF之后,就能够明白WCF在现在的应用程序开发中所起到的作用,WCF能够实现不同技术和平台之间的安全性、可依赖性和用户操作性的实现,对大型应用程序开发起到促进作用。

18.2.1 服务
  服务是一组公开的功能的集合。在软件开发领域,从传统的面向过程,到面向对象,然后历经了面向组件的开发一致发展到当今的面向服务开发。
1.WCF服务
  面向服务开发也并不是什么新技术,面向服务开发只是之前的面向过程、面向对象、组件开发和面向服务开发一种补充。面向服务开发有如下优点:
1)重用性:面向服务的开发提升了应用程序的重用性,通过创建可用于服务的接口能够实现不同应用程序中使用相同或类似程序实现的代码。
2)注重效率:面向服务的开发可以使用现有的服务的集合,这样能够让开发人员能够快速的进行数据交换和开发,而无需关注底层服务的实现。
3)松耦合:面向服务的应用程序是独立于服务执行环境的应用程序,这样就让应用程序成为一个松耦合的应用。
4)职责划分:通过使用面向服务的开发能够进行职责的划分,例如经理和业务人员只需关心业务和统计数据即可,开发人员能够关注应用程序的开发。
  一个面向服务的应用程序会将众多的服务集成到一起,形成单个逻辑单元,如图18-4所示。
面向服务的应用
图18-4 面向服务的应用
  WCF中的服务可以是本地的,也可以使用远程的服务。对于客户端而言,客户端只需要通过使用服务来实现应用程序功能,这些客户端也可以是不同的类型,包括Windows应用程序,ASP.NET应用程序甚至是移动终端。
  对于客户端而言,客户端是通过使用消息与服务器进行通信。消息可以直接在客户端与服务之间进行传递,也可以通过中间方进行传递。在服务器和客户端之间的消息是通过SOAP进行通信的,SOAP与Web应用开发中不同的是,Web应用通常需要某个具体的协议进行相应功能的实现,例如HTTP、FTP协议等,而在WCF中,WCF服务可以在不同的协议中进行传递,并不局限于某个协议。正是因为如此,客户端与服务器之间的要求往往不是必须的,这也就是说,WCF客户端可以与一个非WCF服务器进行信息通信,而一个非WCF客户端也可以与一个WCF服务器进行信息通信。
  为了保障WCF服务器的安全性,WCF服务器不允许直接对服务的调用。对于WCF客户端,只允许使用代理(Proxy)将调用信息转发给服务器。代理向客户端公开的操作和服务器端的操作相同。
2.服务的执行边
  WCF能够让客户端跨越执行边界与WCF服务进行通信,WCF客户端和WCF服务器进行通信必须使用带来与服务进行通信,即使是与本地服务进行通信,如图18-5所示。
WCF与本机服务进行通信
图18-5 WCF与本机服务进行通信
  图18-5展示了WCF客户与本机服务进行通信,WCF不仅能够支持不同应用程序域之间的服务的访问,也能够支持不同进程之间的服务的访问。这就让WCF客户端可以调用一个应用程序中的服务,也可以调用不同应用程序甚至不同进程中的WCF服务。不仅如此,WCF还支持客户端对远程计算机的中服务的调用,在远程服务调用中,WCF允许客户端可以跨越Intranet或Internet的边界进行远程服务的访问和调用,如图18-6所示。
WCF与远程服务进行通信
图18-6 WCF与远程服务进行通信
  图18-6展示了WCF客户端与远程服务进行通信,无论WCF客户端是与远程服务进行通信还是与本地进程进行通信,都需要使用代理。

18.2.2 地址
  在Internet中,为了标识每个计算机,就需要使用IP进行地址划分,在生活中也有此实例,例如每个家庭都有一个门牌号,为了方便找到某个人,则必须通过门牌号找到这个人,同样对于WCF服务而言,每个WCF服务都有一个自己的地址。
1.WCF地址
  WCF地址包含两个元素,服务位置与传输协议,服务位置包括目标机器名、站点或网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。WCF地址也可以是用于服务通信的传输样式。WCF支持的传输样式包括:
1)HTTP:超文本传输协议。
2)TCP:传输控制协议。
3)Peer network:对等网。
4)IPC:基于命名管道的内部进程通信协议。
5)MSMQ:微软消息队列。
  地址通常通过[基地址]/[可选的URI]的格式进行WCF地址描述,示例地址如下所示。
http://localhost:8731
http://localhost:8731/18-2
net.tcp://localhost:8731/server/18-2
net.pipe://localhost/18-2
net.msmq://localhost/18-2

  其中关于http://localhost:8731这个地址可以称作使用http协议,访问计算机为localhost的端口8731正在等待客户端的调用。而对于http://localhost:8731/18-2这个地址可以称作使用http协议,访问计算机为loacalhost的端口为8731的18-2服务正在等待客户端的调用。
2.TCP地址
  TCP地址使用TCP传输控制协议作为通信协议,使用TCP地址的示例地址如下所示。
net.tcp://localhost:8731/server/18-2
如果端口号没有指定,则TCP会使用默认端口号808作为其默认端口,示例地址如下所示。
net.tcp://localhost/server/18-2
3.HTTP地址
  HTTP地址使用HTTP传输控制协议作为其通信协议,使用HTTP地址的示例地址如下所示。
http://localhost:8731/18-2
  如果端口号没有指定,则HTTP会使用默认的端口号80作为其默认端口。
  注意:无论是TCP协议还是HTTP协议,不同的服务可以公用相同的端口号。
4.IPC和MSMQ地址
  IPC地址使用net.tcp作为通信协议,使用net.tcp地址的示例地址如下所示。
net.pipe://localhost/18-2
  正是因为IPC地址使用net.pipe进行传输,所以IPC地址将使用Windows的命名管道机制。在WCF中,如果服务使用命名管道,则该服务只能接收来自同一台客户端计算机的调用。因此,在使用时必须明确的指定WCF提供服务的计算机名,从而为管道名提供一个惟一的标识字符串。而MSMQ地址使用net.msmq进行传输,即使用了微软消息队列机制,MSMQ地址的示例地址如下所示。
net.msmq://localhost/18-2

18.2.3 契约
  在WCF中,所有的WCF服务都会被公开成为契约。契约是服务的功能的标准描述方式,通常情况下WCF包含四种类型的契约,这些契约如下所示。
1)服务契约(Service Contract):服务契约定义了客户端能够执行的操作,服务契约是WCF中使用最为广泛的一种契约。
2)数据契约(Data Contract):数据契约定义了客户端与服务器之间交互的数据类型。
3)错误契约(Fault Contract):错误契约定义了操作中出现的异常,包括定义服务出现的错误并传递返回给客户端。
4)消息契约(Message Contract):消息契约允许服务直接与消息交互,但是WCF很少使消息契约。
  WCF使用特性ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法。示例代码如下所示。
+展开
-C#
    [ServiceContract]//标识服务契约
    public interface IService1//实现接口
    {
        [OperationContract]//方法声明
        string GetData(int value);//创建方法
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);// 任务: 在此处添加服务操作
    }

  上述代码使用ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法,OperationContract只能用于方法,指明客户端是否能够调用此方法。使用OperationContract标识可以标识私有方法以使用SOA的方式进行构架,虽然这样是可以实现客户端调用,但是作为面向对象的设计是不推荐使用该方法的。由于能够使用ServiceContractAttribute来标识服务契约,开发人员能够自定义标识指定相应的方法是否能够被客户端调用,示例代码如下所示。
+展开
-C#
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);//标识方法
        string Post(string content);

  在上述代码中的Post方法不会成为契约。WCF允许开发人员使用DataContractAttribute、DataMemberAttribute来标识自定义数据类型和属性,示例代码如下所示。
+展开
-C#
        [DataMember]//设置DataMember
        string stringValue = "Hello ";//创建string变量
        [DataMember] //设置DataMember
        public bool BoolValue//设置属性
        {
            get { return boolValue; }
            set { boolValue = value; }//设置属性默认值
        }
        [DataMember]//设置DataMember
        public string StringValue//设置属性
        {
            get { return stringValue; }
            set { stringValue = value; }//设置属性默认值
        }

  上述代码使用了DateMember定义了属性和相应的字段,这样就可以在服务方法中传递复杂的数据体了。

加支付宝好友偷能量挖...


评论(0)网络
阅读(94)喜欢(0)Asp.Net/C#/WCF