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

    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+"\t"+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》

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

    源码看这里

  • 相关阅读:
    最大子数组问题(分治策略实现)
    Solving the Detached Many-to-Many Problem with the Entity Framework
    Working With Entity Framework Detached Objects
    Attaching detached POCO to EF DbContext
    如何获取qq空间最近访问人列表
    Health Monitoring in ASP.NET 2.0
    problem with displaying the markers on Google maps
    WebMatrix Database.Open… Close() and Dispose()
    Accessing and Updating Data in ASP.NET: Retrieving XML Data with XmlDataSource Control
    Create web setup project that has crystal reports and sql script run manually on client system
  • 原文地址:https://www.cnblogs.com/grj001/p/12223777.html
Copyright © 2011-2022 走看看