今天开始学习WCF(Windows communication foundation),之前完全没有接触过,一步一步慢慢学吧
首先,概念:
(1)体系中的角色:服务端与客户端。
(2)服务和操作:服务端公开一个或多个服务,一个服务拥有一个或多个操作。客户端调用服务的操作来获得逻辑。
(3)终结点:操作的地址,客户端用于寻找服务端。(终结地址是服务地址的子地址或相对地址,服务地址是终结地址的父地址,也称基地址。)
(4)绑定:客户端与服务端的沟通方式,即协议。
(5)元数据:服务的接口描述、操作的方法签名、数据的类描述等信息。
服务端主要结构:
服务协定(ServiceContract):表示一个服务接口
操作协定(OperationContract):表示一个操作接口
服务类(Service Class):实现一个接口
WCF最基本的编程步骤:
1.在服务端定义服务协定接口与操作协定接口
2.用一个服务类来实现服务协定接口与操作协定接口
3.配置和建立一个宿主程序用来寄存服务
4.配置和建立客户端指向服务基地址
5.调用服务
具体的“Hello WCF!”实现步骤:
(1)创建服务端程序
①WCF的服务必须有一个宿主来承载,这个宿主可以是控制台程序、窗体程序、IIS、Windows服务等,这里选择最简单的控制台程序,放在Service文件夹内。
②WCF的核心部件都在System.ServiceModel这个引用中,所以首先添加这个引用。
③定义服务与操作
[ServiceContract]
interface IHelloWCFService
{
[OperationContract]
string HelloWCF();
}
④实现服务协定
public class HelloWCFService : IHelloWCFService
{
public string HelloWCF()
{
return "Hello WCF!";
}
}
⑤配置和承载服务
写好服务后,就需要在宿主中将该服务承载起来,这样采用被客户端访问与调用。WCF通过使用ServiceHost实例来承载服务,因为我们使用的是控制台程序,所以需要手动创建ServiceHost实例来承载;如果使用IIS来寄存服务,则会自动生成和管理ServiceHost实例。
每个ServiceHost实例对应和管理一个服务,所以在建立ServiceHost实例前首先要给它一个基地址即服务地址。这样,ServiceHost就可以根据基地址来为自己管理的服务创建终结点的相对地址了。
首先建立一个Uri对象,为ServiceHost提供一个基地址:
Uri baseAddress = new Uri("http://localhost:800/MyService");
其中localhost是本机,800为服务端口(随便取,不冲突就行),MyService是服务地址(随便取)。
然后正式建立ServiceHost实例:
ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress);
可以看出ServiceHost的构造函数有两个参数,第一个参数是服务类型,选用的是HelloWCFService,为服务协定实现类,而非接口;第二个参数为服务基地址。
定义好服务寄宿主后,接下来就是添加终结点地址:
host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService");
第一个参数制定了服务协定;第二个参数定义了绑定,就是服务端与客户端之间的沟通方式这里指定的是WSHttpBinding的实例,即使用Http协议通信;第三个参数为终结点地址,使用的是相对地址,对将该地址与基地址结合,即http://localhost:800/MyService/HelloWCFService。
终结点地址确定好后,就是元数据的交换。首先要引入命名空间: System.ServiceModel.Description;然后创建一个服务元数据行为对象:
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
最后,把这个服务元数据行为对象添加到宿主ServiceHost 对象的行为集合中去:
host.Description.Behaviors.Add(smb);
⑥启动宿主,开始服务
host.Open();
因为是控制台程序,我们需要添加一些输出和一些等待输入来保持程序的持续运行。等待用户输入任意键结束程序:
Console.WriteLine("Service is Ready");
Console.WriteLine("Press Any Key to Terminated...");
Console.ReadLine();
⑦关闭宿主,结束服务
host.Close();
服务端所有代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace HelloWCFService
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:800/MyService");
ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress);
host.AddServiceEndpoint(typeof(IHelloWCFService), new WSHttpBinding(), "HelloWCFService");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Service is Ready");
Console.WriteLine("Press Any Key to Terminated...");
Console.ReadLine();
host.Close();
}
}
[ServiceContract]
interface IHelloWCFService
{
[OperationContract]
string HelloWCF();
}
public class HelloWCFService : IHelloWCFService
{
public string HelloWCF()
{
return "Hello WCF!";
}
}
}
运行后的结果:
为了验证我们的宿主和服务运行正常,在上面的程序运行的时候,不要关掉它,然后打开浏览器,输入服务地址:
这就说明宿主和服务运行正常。
(2)创建客户端程序
①还是创建一个控制台程序,放在Client文件夹内。
②在保证服务开启的前提下,添加服务引用,得到服务元数据:
③VS2008会自动建立一个客户端代理类,在刚刚指定的MyService命名空间下,我们创建一个这个类的对象,然后通过这个对象来调用服务操作。
MyService.HelloWCFServiceClient client = new MyService.HelloWCFServiceClient();
④ 使用client 对象,我们就可以调用服务中公开的操作了。
string strRet = client.HelloWCF();
Console.WriteLine(strRet);
Console.ReadLine();
client.Close();
客户端所有代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWCFClient
{
class Program
{
static void Main(string[] args)
{
MyService.HelloWCFServiceClient client = new MyService.HelloWCFServiceClient();
string strRet = client.HelloWCF();
Console.WriteLine(strRet);
Console.ReadLine();
client.Close();
}
}
}
运行结果:
第一个程序—“Hello WCF”完成!
Hello WCF!
总结:
通过这个例子,我们以最简单的方式实现了一个WCF 程序,我们应该了解一个WCF 程序最基本的编程步骤。
(1) 定义服务协定接口和接口中的操作协定。
(2) 用一个服务类实现服务协定接口和接口中的操作协定。
(3) 建立一个宿主程序用来寄存服务。
(4) 为服务建立ServiceHost 对象并指定要寄存的服务类和服务基地址。
(5) 为ServiceHost 添加终结点,指定其服务协定、绑定类型和终结点地址(或相对地址)。
(6) 为ServiceHost 添加服务元数据行为对象,要将该对象的HttpGetEnabled属性设为true 以启动元数据交换。
(7) 启动ServiceHost。
(8) 建立客户端。
(9) 为客户端添加指向服务基地址的服务引用以下载元数据。
(10) 客户端使用代理类调用服务操作。
参考文章:
http://blog.csdn.net/songyefei/article/details/7363296