WCF初见

2024-05-25 15:08
文章标签 wcf 初见

本文主要是介绍WCF初见,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1.WCF作用


win32中,应用程序是运行在进程(Process)的线程(Thread)中的,.Net平台出现之后,出现了AppDomain(应用程序域),其实就相当于在进程和线程之间又有了一层包装,类似于子进程的概念,在一个进程(或应用程序域)中的对象能进行直接的访问和控制,但超出这个范围,便不能进行直接的访问和控制了,所以进程(或应用程序域)有一定的隔离作用,如果是分布在不同网络,不同操作系统上的不同进程,他们进行通讯的难度就更大,而分布式应用程序要求的就是将原本被隔离的作用域通过一定的契约联系起来,从而达成多个系统的沟通协作。比如在Win32时代,经常使用映射内存文件来实现进程之间的互操作问题,还有在Windows程序中,用Windows消息wm也能实现不同进程之间的通讯问题,但这些都有局限性,因为他们不能很好的解决跨平台,跨网络问题,而WCF可以。


2.WCF体系架构


WCF拥有一个非常灵活的分层体系结构,分布式应用程序可以使用高级API或者低级API编写。高级API或者服务层可以用于调用方法和事件。服务层把这些高级的抽象代码转换为消息,以使用低级API上的信道和端口。

      图1中显示了WCF应用程序的各个层。

              

WCF提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,而这些支持均依赖于如图2所示的WCF构架。

                
      
在客户端,分布式应用通过一个代理来转发对宿主端所提供服务的调用,而代理拥有和服务相同的操作接口,另外还有一些附加的代理管理方法。这也就意味着客户端从来不会直接调用服务,即便这个服务就在本机的内存中。当客户端代理接收到来自客户端的调用请求后,它将消息通过信道链向下传递。每个信道都会执行相应的消息的调用前处理,例如对消息的编码、提供可靠的会话、对消息进行加密等。客户端的最后一个信道则是传输信道,根据配置的传输方式发送消息给宿主。
      
在宿主端,消息同样通过信道链进行传输。与客户端信道相对应,宿主端信道也会对消息执行相应的宿主端的调用前处理,例如对消息的解码、提供会话管理、对消息进行解密等。宿主端的最后一个信道则负责将消息发送给消息分发器(Dispatcher),由分发器负责调用服务的实例。


3.WCF服务框架


宿主(Host),即承载WCF Service运行的环境。可用的宿主环境包括:
(1)
自承载方式:在控制台应用程序与基于WinForm的应用程序中都可以使用这种方式;
(2)
系统服务方式:服务可以随着操作系统的启动而自动启动;
(3) IIS
方式:Web Services的部署方式类似,由请求消息来激活服务,但只支持HTTP方式的绑定;
(4) WAS
Windows Process Activation Service)方式:这个宿主是IIS7的一部分,只有 Windows Vista Windows Server 2008提供默认支持,它支持几乎所有的通讯协议并提供了应用程序池、循环回收、空闲管理、身份管理、隔离等强大的功能。   

     服务类(Service Class)是指一个标记了一些WCF特有的属性的类,它包含了对服务的业务逻辑的具体实现。

     端点(Endpoints)是WCF实现通信的核心要素,客户端和服务端都通过端点来交换消息,WCF允许我们为服务添加多个绑定和端点。端点由地址(Address)、绑定(Binding)以及契约(Contract)三部分组成,如下图所示。在WCF中,类ServiceEndpoint代表了一个Endpoint,在类中包含的EndpointAddressBindingContractDescription类型分别对应端点中的地址、绑定以及契约。

                                                                             




地址:每个服务都会关联到一个唯一的地址,因此地址定位和唯一标志了一个端点,其主要提供了两个重要信息: 服务位置以及传送协议。在WCF 中,地址由System.ServiceModel.EndpointAddress对象来表示,其包括URIIdentityHeaders三个要素。

绑定:绑定提供了一种可设置的方式来选择传输协议、消息编码、通讯模式、可靠性、安全性、事务传播以及交互方式等。例如在传输协议上可以选择HTTP/HTTPSTCPP2PIPC甚至是MSMQ等方式。消息编码上可以选择使用纯文本方式来确保互操作能力,或者选择二进制编码来优化性能,或者使用 MTOM来提高负载能力,甚至是自定义编码方式。 WCF中提供了BasicHttpBindingNetTcpBindingNetPeerTcpBindingNetNamedPipeBindingWSHttpBindingWSFederationHttpBindingWSDualHttpBinding NetMsmqBinding以及MsmqIntegrationBinding九种标准类型的绑定。

契约:契约是用来描述服务功能的一种平台中立的标准方式,WCF 所有服务都需要实现一个或多个契约。WCF 定义了四种类型的契约:
(1)
服务契约 (Service Contracts): 定义了客户端可以使用哪些服务操作。
(2)
数据契约 (Data Contracts): 定义了服务传输的数据类型。WCF 定义了一些隐式数据契约,比如 intstring 等,但更多时候需要使用 DataContractAttribute 显式定义那些自定义类型数据的数据契约。
(3)
错误处理契约 (Fault Contracts): 定义了服务引发的错误信息,以及如何将这些异常传递给客户端。
(4)
消息契约 (Message Contracts): 允许直接操控服务的消息内容和格式。

一般情况下,应当用接口来定义服务契约,尽管也可以使用类。将服务契约定义为接口基于如下几点优点:
(1)
便于契约的继承,不同根的类型可以自由实现相同的契约;
(2)
同一服务类型可以同时实现多个契约;
(3)
类似于接口隔离原则,可以随时修改服务类型的实现而不影响其它实现;
(4)
便于制定版本升级策略,新、旧版本的服务契约可以同时使用而互不影响。

WCF中,对于自承载的服务,端点的相关的信息可以有代码实现与配置文件两种定义方式。而对于IIS承载服务,端点的相关的信息一般定义在虚拟根目录下的Web.Config文件中。一般来讲,使用配置文件来定义端点相关信息是更为灵活、更为推荐的一种方式,其可以在不修改代码、不重新发布系统的情况下对服务的地址、绑定和契约等参数进行修改(因为修改config类型文件的内容是不需要重新编译和重新部署的)。

在下面的代码中具体说明了如何定义宿主端的端点相关信息。其中地址为http://localhost:8080/HelloService,契约为WCFService命名空间下的IEcho接口,绑定采用的是WSHttpBinding方式。值得注意的是,代码中的Service为相对地址,http://localhost:8080/提供的是基址,当然去掉基址直接将address设为http://localhost:8080/Service也是可以的。代码中还添加了名为MyServiceTypeBehaviors的行为配置,其将serviceMetadata节中的httpGetEnabled属性设为了true,目的是为了自动透过 HTTP-GET发布服务的元数据。WCF提供的另外一种发布元数据的方式是使用专门的 MEX 端点。

<system.serviceModel><services><service name=" WCFService. Service " behaviorConfiguration="MyServiceTypeBehaviors" ><endpoint contract="WCFService. IEcho" binding="wsHttpBinding" address="Service"/><host><baseAddresses ><add baseAddress="http://localhost:8080/"/></baseAddresses></host></service></services><behaviors> <serviceBehaviors><behavior name="MyServiceTypeBehaviors" ><serviceMetadata httpGetEnabled="true" /></behavior></serviceBehaviors></behaviors></system.serviceModel> 


4.WCF服务模型


           WCF服务通过XML文档进行描述,这些文档主要由三个部分组成:


    • 服务部分说明服务位于何处。

    • 绑定部分说明服务所能理解的标准通信协议。

    • 第三个部分列出服务所能提供的所有操作,它定义了服务根据接收的消息所发出的响应信息。


WCF模型中这三部分被称为:地址(address)、绑定(binding)和契约(contract),为易记起见可简称为ABC,即利用服务模型创建软件通信功能而需要遵循的三个步骤。


建立WCF模型,首先从建立契约开始(主要引用.net Framework里的System.ServiceModel)
先写一个接口interface

public interface IEcho
{stringEcho(string input);
}
将接口指定为WCF契约
[ServiceContract]
public interface IEcho
{[OperationContract]stringEcho(string input);
}


接下来就可实现契约接口,自定义类,如果某个类实现了WCF契约接口,它就成为服务类型(service type),并可以通过ServiceBehavior特性给服务类型添加行为来控制。
[ServiceBehavior(ConcurrencyMode =ConcurrencyMode.Multiple)]
public classService : IEcho
{string Echo(string input){ return input; }
}


最后将服务承载(host)在一个应用程序域中。IIS和其他任何.NET程序都可以为承载服务提供应用程序域,承载服务使用WCF模型提供的ServiceHost类:


using (ServiceHost host = new ServiceHost(typeof(Service)))
{host.Open();Console.WriteLine("服务已启动...");Console.ReadKey(true);host.Close();}

                              


1OneWay:这种消息交换模式在调用方法后会立即返回而不需要等待服务端的消息返回。
2 Request/Reply:这种消息交换模式属于同步调用。在调用服务方法后需要等待服务端的消息返回。
3Duplex:这种消息交换模式具有客户端与服务端双向通信的功能,同时它的实现还可以使消息交换具有异步回调的作用。





这篇关于WCF初见的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001853

相关文章

堆与堆排序之初见

堆(本文只提二叉堆,当然也有多叉堆)作为一种数据结构,是一个数组,可以被看成是一个近似的完全二叉树,树上的每一个节点对应数组中的一个元素,并且除了最底层节点外,该树是完全充满的,而且是从左向右依次填充。 我们目前经常听到的名词“堆”已经被引申为“垃圾收集存储机制”,但本文提及的“堆”指的是堆数据结构。 为了后续描述方便,我们定义堆的数组为H,用H.length表示堆数组的大小,用H.size表示堆

ImageLoader初见

下载项目地址 点击打开链接 activity_main.xml主页布局 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:or

[Jsprit]Jsprit学习笔记-初见Jsprit-doc

Jsprit 是一个用于解决旅行商问题(TSP)和车辆路径问题(VRP)的开源 Java 工具包。以下是使用 Jsprit 的一些基本步骤和要求: 系统要求 Jsprit 需要 Java 1.7.0 或更高版本。 模块组成 Jsprit 是一个多模块项目,包括以下模块: jsprit-core:核心模块。jsprit-analysis:分析模块。jsprit-instances:实例模块

WCF的一个小Demo

客户机使用浏览器访问服务器A,服务器A为了业务需要与其他各种应用部署在服务器B、C、D....再通过WCF技术互相通信,相互访问...然而面向服务的好处不仅仅在此,他还提供了不同语言不同操作系统的可交互性. ITOO的服务端有许多我们熟悉的东西,例如那些个D层还有B层,陌生的东西就是一个WCF了。现在在我自己看来WCF就是为了避免重复开发,然后提供一个数据通信的接口给大家,让开发

(三)WCF之契约

自从我们接收ITOO项目之后,就必须跟WCF打交道,既然必须直面WCF,我就对WCF进行了研究(还不是很深入,是自己目前的理解)。之前对WCF的一些基础知识进行了简单的介绍,本篇重点来介绍WCF的契约(Contracts)。 [什么是契约?]     生活中:指双方共同定义的协议。     WCF中:任何一个分布式应用程序,它之所以能够互相传递消息,都是事先制定好数据交换规则的

(二)WCF的Binding模型

上篇博客对WCF中的基础知识进行了介绍,先从概念上知道了WCF的一些理论,在abc模型中B是Binding,WCF为我们提供了多种绑定机制,我们先从了解各种绑定机制开始,只有知道之后才能在实践中更好的利用。 【采用Binding原因】     由于服务之间的通信方式多种多样,就有多种可能的通信模式。包括:同步的请求/应答消息,或者异步的“即发即弃”消息;双向消息等。传递消息的

(一)WCF基础

我们近期在做项目的时候用到了WCF,之前已经看了部分视频,对于WCF有了一定的了解,但仅限于能够根据搭建好的框架使用WCF,还不了解。所以就进行了研究,这样既有实践也能增加理论,二者结合,使用起来更胜一筹。     小编先从一些基本的概念开始,从基础一点点开始研究。 【WCF简介】      WCF(Windows Communication Foundation)是由微

【WCF 2】理解WCF框架的简单小实例

导读:上篇博客介绍了WCF框架的整体情况,然后,闲着没事儿,自己做了一个及其简单的WCF框架的例子帮助自己理解。从简单的入手,一步一步深入!本篇博客是介绍怎么用VS2012从头创建一个WCF项目,是一个流程化的介绍,有清楚了解的,建议路过即可!   一、建立WCF服务应用程序   1.1,编写IService类接口   <span style="font-family:KaiTi_

【WCF 1】WCF框架宏观了解

导读:使用WCF框架爱开发项目也有很长一段时间了,最开始的时候,是理解的不深,所以不写博客进行总结。后来是项目赶,发现需要总结的有很多,一直没有把WCF排上日程,尤其是最近研究EF这一块,更是研究了一些ORM框架的东西,包括Hibernate工作原理等。最后,是因为自己都会了,觉得就先不总结了吧,反正都会。现在,正式总结WCF的第一篇博客,先宏观 介绍一下。   在基本概述中,主要是从书本、网

[项目基础]WCF初识小结

一、基本内容     Windows通信基础(Windows Communication Foundation,WCF)是基于windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK)。     思想发展:面向过程——》面向对象——》面向服务 二、契约(协定)     1、分类:         服务契约(Service Contract)