WCF概述

从过去到未来。     函数 → 对象→ 组件 → 服务

结构化编程(SP )→ 面向对象编程(OOP )→ 组件化开发(CBD )→ 基于服务的开发(SOA

面向对象编程/ 组件化开发用于创建应用程序,面向服务的编程则用于连接这些应用程序。

WCF 的作用: WCF 使应用程序功能成为一个通过网络可以访问的服务。

WCF 的特点: 统一了以前微软平台上的各项技术,允许客户端和服务端内部都使用CLR 数据类型,而WCF 则在中间完成所有转换工作。另外,WCF 也允许非WCF 客户端来访问WCF 服务端。

WCF 一统江湖: ASMX Enterprise ServicesWSE.NET RemotingMessage-Oriented Programming

WCF 引例中掌握WCF 基本概念

引例介绍:

WCF 服务端和客户端应用程序都是控制台应用程序。WCF 服务端应用程序( HelloWCFServiceServer

在本机8000 端口发布一个简单的WCF 服务,向外界返回一个“Hello.WCF !”字串。客户端通过HTTP 协议访问此WCF 服务,显示出从服务端取回的字串。

一、服务端实现:

1、 需要给客户端和服务端应用程序同时添加对System.ServiceModel 程序集的引用。

2、 服务端声明契约接口, 契约(Contract )规定了WCF 服务端与客户端相互交换信息的格式。

[ServiceContract]

Public interface IHelloWCFService{ [OperationContract] string GetServiceMessage();}

3、 服务对象负责具体实现服务,简单地说:当客户端访问服务时,一个服务对象被创建,相应的方法(由契约所规定的)被调用,方法执行的结果被传回给客户端。

public class ServiceProvider:IHelloWCFService

{public string GetServiceMessage(){ return "Hello,WCF!";}}

4、 服务对象由服务宿主负责创建。服务宿主是一个ServiceHost 对象,每个ServiceHost 对象都对应着一个服务(本例通过其构造函数实现这种对应关系),在合适的时候(通常是客户端发出调用服务的请求时)ServiceHost 对象会创建服务对象(本例为ServiceProvider 对象)来响应客户端请求。

static void Main(string[] args)

{

    ServiceHost host=new ServiceHost(typeof(ServiceProvider),

    new Uri("http://localhost:8000/HelloWCFService"));

    host.AddServiceEndpoint(typeof(IHelloWCFService),new BasicHttpBinding(),"");

    host.Open();

}

http://localhost:8000/HelloWCFService 代表服务的地址,不同的服务必须拥有不同的地址。

当调用ServiceHost.Open() 方法时,WCF 将在本机8000 端口处监听客户端传来的请求并将其转发给相应的服务对象处理。注意:不同的服务可以重用同一端口,但其服务地址绝不能一样。ServiceEndPoint 是服务的访问点,客户端只能通过这一访问点才能访问服务。Service End Point 中文译为“服务终结点”。

二、访问WCF 服务的客户端实现

1 、为了与服务端通讯,客户端需要知道以下的事实:(1WCF 服务的地址(2WCF 服务的契约

2 、客户端引入WCF 契约。 客户端必须使用与服务端一致(或者相互兼容)的契约,才能保证调用的顺利完成。与服务端实现的第2 条一样。或在Visual Studio 中从“项目”菜单中选择“添加服务引用”命令,在弹出的对话框中输入元数据交换终结点地址。http://localhost:8000/HelloWCFService/mex

3 、客户创建代理

ChannelFactory<IHelloWCFService> channelFactory=new ChannelFactory<IHelloWCFService>(

New BasicHttpBinding(),new EndpointAddress("http://localhost:8000/HelloWCFService"));IHelloWCFService Proxy = channelFactory.CreateChannel();

客户端需要创建一个服务代理对象proxy (必须实现服务契约IHelloWCFService )。服务代理对象由通道工厂(ChannelFactory )负责创建。

4 、通过代理访问WCF 服务。代理对象创建以后,访问WCF 服务就体现为对代理对象方法(由服务契约所约定)的调用。这些调用将会被远程传送到WCF 服务端。

   Console.WriteLine(“ 从服务端返回:”Proxy.GetServiceMessage());

 

一个WCF 服务向WCF 客户提供一些可用的功能。WCF 客户通过终结点(endpoint) 来访问WCF 服务。因此,一个WCF 服务至少要包含一个终结点。如果允许服务端反过来调用客户端的代码(即所谓回调callback ),则客户端也应该提供回调所使用的终结点。WCF 服务与客户程序要想成功通讯,必须遵循特定的协议,WCF 规定,在WCF 服务与WCF 客户间发送的所有消息都遵循SOAP 协议。

 

契约: 契约定义了一个终结点向外界发布的操作,以及WCF 服务与客户相互通讯时的消息格式。WCF 中有四种类型的契约,引例中定义的是“服务契约”。

1 、服务契约: 定义一个接口,给接口附加[ServiceContract] ,给接口方法附加[OperationContract]

2 、数据契约: 数据契约定义将在客户端与服务器端传送的各种数据类型。定义数据契约时需要使用[DataContract][DataMember]

3 、消息契约: 可以使用消息契约来定制WCF 服务与WCF 客户间相互通讯的SOAP 消息格式。

4 、错误契约: 定义在服务中如何处理异常,以及这些异常又如何传送到客户端。

 

WCF 地址类型与通讯协议对应

使用TCP :地址以“net.tcp ”打头,多用于局域网环境

使用HTTP :地址以“http ”和“https ”打头,多用于互联网环境

使用消息队列:地址以“net.msmq ”打头。消息队列用于提供离线的消息服务,即调用服务时WCF 服务程序可以还没运行,调用请求被放到一个消息队列中,WCF 服务程序启动后取出此请求,解析后向WCF 客户提供服务。适用于局域网环境。使用命名管道:地址以“net.pipe ”打头。当WCF 服务与WCF 客户都位于同一台计算机时,这种通讯方式可以获得好的性能。

 

WCF 预定义绑定

BasicHttpBinding WSHttpBindingWSFederationHttpBinding :使用HTTP

WSDualHttpBinding :使用两个HTTP 通道实现双向通讯

NetTcpBinding :使用TCP

NetPeerTcpBinding :使用P2P (很Cool 的一个绑定,后面会用它来开发有趣的应用)

NamedPipeBinding :使用命名管道

NetMsmqBinding MsmqIntegrationBinding :使用消息队列

 

WCF 服务应有一个宿主程序。可选的宿主程序类型有:IISWASWindows Form/WPF ApplicationConsole ApplicationWindows Service 。在客户端可以访问服务之前,服务宿主进程必须启动。一个服务宿主程序可以同时承载多个服务。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值