zoukankan      html  css  js  c++  java
  • WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序

    (原创:灰灰虫的家http://hi.baidu.com/grayworm)

    在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS、Self-Host、Windows Service Host。当WCF编写完成后我们一般要通过这三种方式的一种发布WCF服务,当WCF服务发布后,我们就可以编写客户程序来与服务的终结点进行通信。
    这篇文章我们主要来介绍如何编写客户程序。

    前提:
    1.事先建立好一个WCF服务
    2.使用上面任何一种方式发布WCF。
    在这里我们使用上篇文章中介绍的WindowsServiceHost发布BookService程序。


    《图1》


    《图2》

    第一步:新建一个项目
    此项目可以是控制台程序、WinForm、ASP.NET中的任何一个,甚至还可以是其它语言的应用程序,如:JavaEE等。
    在这里我使用控制台程序为例,建立一个客户项目Client。


    《图3》

    第二步:为此项目添加Web引用。
    右击项目名称,选择“添加服务引用...”


    《图4》

    在弹出的“添加服务引用”的对话框中,在地址栏里我们输入前面我们发布的WCF服务的终结点的地址http://localhost:8081/BookService
    点击“前往”后,会到上面的地址中去下载WCF服务的元数据,根据接收到的元数据信息,在“服务”列表中显示出该地址中相应的服务(BookService),展开BookService会看到该服务的服务契约(IBookService),点击IBookService,我们会看到该服务契约中包含的方法契约。

    在“命名空间”文本框中为该服务引用指定命名空间,此处为WS

    《图5》

    点击完成,在“解决方案管理器”中我们可以看到添加完服务引用后的项目。它会自动为我们添加System.ServiceModel、System.Runtime.Serialization两个本地引用和一个WS服务引用。


    《图6》

    双击打开App.Config会发现里面的内容都自动配置好了,


    《图7》

    右击服务引用WS,选择“在对象浏览器中查看”,会在对象浏览器中显示出该服务引用的元数据结构。


    《图8》


    《图9》
    到目前为至,我们把WCF服务引用添加到了我们Client程序中了。

    第三步:编写客户端程序代码访问WCF服务
    实例化BookServiceClient,它是我们访问WCF服务的代理类。
    在BookServiceClient实例化时,需要在此类的构造函数中指定访问WCF服务的终结点的名称。
    我们打开App.Config,在想要与客户端进行通讯的<endpoint>元素中找到其“name”属性,并把该属性的值复制并粘贴到BookServiceClient的构造函数中。

    WS.BookServiceClient client = new Client.WS.BookServiceClient("NetNamedPipeBinding_IBookService");

    使用client对象与WCF服务通信,添加两本书。
    WS.Book book1 = new Client.WS.Book();
    book1.BookName = "赢在中国";
    book1.BookPrice = 28.8M;
    client.AddBooks(book1);

    WS.Book book2 = new Client.WS.Book();
    book2.BookName = "东周列国传";
    book2.BookPrice = 52.0M;
    client.AddBooks(book2);

    使用client对象与WCF服务通信,查询现有的书籍列表。
    foreach (WS.Book book in client.GetAllBooks())
    {
        Console.WriteLine(book.BookName+" "+book.BookPrice);
    }
    运行结果:


    《图10》

    如果由于网络比较慢,或WCF服务器压力比较大时,当我们Client向他们发出请求时并不会及时得到响应,会出现一段时间的延迟。如果Client是控制台程序就会出现“卡”的效果,如果Client是WinForm窗体的话,会出现按钮点下去弹不起来的“假死”情况,这是因为我们是同步访问WCF服务。一般我们访问远程服务的时候很少使用这种同步访问,因为访问远程服务有好多不确定性,如果使用同步服务的话客户端会需要不断的等待,这是很糟的情况。
    下面我们看一下如何使用异步来访问WCF服务。

    第一步:修改服务引用的配置。
    在Web服务引用WS上右击,选择“配置服务引用...”,引出“配置服务引用”对话框。把“生成异步引用”复选框打上勾。


    《图11》


    《图12》

    第二步:查看修改完的服务引用
    在Web服务引用WS上右击,选择“在对象浏览器中查看...”, 在对象浏览器中我们可以看到BookServiceClient 对象中多了好多的方法和事件。这些方法就是为我们产生的异步调用方法。


    《图13》


    《图14》

    第三步:修改客户端代码:

    static void Main(string[] args)
    {
        WS.BookServiceClient client = new Client.WS.BookServiceClient("NetNamedPipeBinding_IBookService");
        //指定异步添加书籍完成后要执行的方法
        client.AddBooksCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_AddBooksCompleted);
        //指定异步查询书籍完成后要执行的方法
        client.GetAllBooksCompleted += new EventHandler<Client.WS.GetAllBooksCompletedEventArgs>(client_GetAllBooksCompleted);

        WS.Book book1 = new Client.WS.Book();
        book1.BookName = "赢在中国";
        book1.BookPrice = 28.8M;
        //调用异步添加书籍
        client.AddBooksAsync(book1);

        WS.Book book2 = new Client.WS.Book();
        book2.BookName = "东周列国传";
        book2.BookPrice = 52.0M;
        //调用异步添加书籍
        client.AddBooksAsync(book2);

        //调用异步显示书籍
        client.GetAllBooksAsync();
        Console.ReadLine();
    }
    //异步显示书籍要执行的方法,打印书籍列表
    static void client_GetAllBooksCompleted(object sender, Client.WS.GetAllBooksCompletedEventArgs e)
    {
        foreach (WS.Book book in e.Result)
        {
            Debug.WriteLine(book.BookName);
        }
    }
    //异步添加书籍完成后要执行的方法,显示BookAddOver字样
    static void client_AddBooksCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        Debug.WriteLine("BookAddOver");
    }

    运行结果:


    《图15》

    -----------------

    源码看这里

  • 相关阅读:
    leetcode : 3 sum
    leetcode : Merge two sorted lists
    算法:海量数据问题
    计算机基础:数据库
    计算机基础:Linux
    Java:JVM
    Java:Basic/集合框架/多线程
    Java:面试题
    框架:SSM整合
    LeetCode: Tags-[Bit Manipulation]
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3722410.html
Copyright © 2011-2022 走看看