关闭

学习WCF之路1:Hello WCF!

标签: wcf
133人阅读 评论(0) 收藏 举报
分类:

今天开始学习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();


服务元数据行为有一个属性HttpGetEnabled,我们要把它设为true ,这样,客户端就可用HTTP GET的方法从服务端下载元数据了:

    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) 客户端使用代理类调用服务操作。




参考文章:

[老老实实学WCF] 第一篇 Hello WCF

http://blog.csdn.net/songyefei/article/details/7363296


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8854次
    • 积分:174
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档