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

时间:2022-05-27 04:44:31

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

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

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

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

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

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

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

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

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

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

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

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

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

《图5》

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

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

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

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

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

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

WCF开发实战系列五:创建WCF客户端程序
《图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);
}
运行结果:

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

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

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

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

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

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

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

WCF开发实战系列五:创建WCF客户端程序
《图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");
}

运行结果:

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

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

源码看这里

WCF开发实战系列五:创建WCF客户端程序的更多相关文章

  1. WCF开发实战系列一:创建第一个WCF服务

    WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...

  2. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  3. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

  4. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  5. WCF开发实战系列一:创建第一个WCF服务 转

    转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811064.html 在这个实战中我们将使用DataContract,Servic ...

  6. WCF开发实战系列二:使用IIS发布WCF服务 转

    转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811141.html 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们 ...

  7. WCF学习心得----(五)生成客户端

    WCF学习心得----(五)生成客户端 1.    通过Svcutil.exe工具直接生成客户端 1.1     将服务承载于IIS上 1.1.1 在IIS中新建网站,所示效果如下图: 1.1.2   ...

  8. WCF入门教程系列五

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  9. (1)WCF少废话系列之 &lowbar;Hello WCF&excl;

    本节旨在通过实例的方式让初学者对WCF有一个感性的认识,坚持由特殊到普遍再由普遍到特殊的认知规律. WCF(Windows Communication Fundation),微软分布式通信架构的集合, ...

随机推荐

  1. 什么是JVM?

    什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  2. WPF 检测输入状态

    [DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); pub ...

  3. 每日一练--C语言--串

    目标 实现串的经典模式匹配算法与KMP算法. 简述 自定义串结构: 串采用定长顺序存储结构,串从下标1开始存储,0下标存储串的实际长度: 匹配成功返回匹配位置,匹配失败返回0. #include &l ...

  4. EF Code First 学习笔记:表映射

    多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...

  5. 201521123109《java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1 ...

  6. 55&period; Jump Game&lpar;中等&rpar;

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  7. SVN远程管理

    1.使用远程桌面连接工具,分别填写连接地址和用户名进行连接 2.紧接着进行安全登录. 3.打开VisualSVN Server Manager工具进行显示已经拥有的项目和分配好的群组管理. 这样子就可 ...

  8. eclipse core expression usage

    http://codeandme.blogspot.com/2012/04/expression-examples.html We need to set checkEnabled on the vi ...

  9. Cordova - OSX中,nodev7&period;5&period;0无法安装cordova解决方法!

    OSX:10.12.3 node:v7.5.0 结果很搞笑啊,先前怎么安装都不成功,现在居然安装成功了!我认为安装失败最大的原因是:你不能访问谷歌的原因!!!! 使用最新稳定版,有助于安装,可以顺便安 ...

  10. git学习&lpar;一&rpar; 如何将项目上传到github

    用了github有了段时间,但是感觉都是断断续续的,这次花了点时间来总结下,已方便下次忘记的时候拿出来看一下: 自己主要是参考了这个网站来学习的: git教程 -廖雪峰 第一步: 创建github账号 ...