本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆

一、简介

在前面的随笔中,详细的介绍了WCF客户端服务的调用方法,但是那些操作全都是同步的,所以我们需要很长的时间等待服务器的反馈,如何一台服务器的速度很慢,所以客户端得到结果就需要很长的时间,试想一下,如果客户端是个web项目,那么客户体验可想而知,所以为了不影响后续代码执行和用户的体验,就需要使用异步的方式来调用服务。注意这里的异步是完全针对客户端而言的,与WCF服务契约的方法是否异步无关,也就是在不改变操作契约的情况下,我们可以用同步或者异步的方式调用WCF服务。

二、操作示例

1、WCF服务层搭建:新建契约层、服务层、和WCF宿主,添加必须的引用(这里不会的参考本人前面的随笔),配置宿主,生成解决方案,打开Host.exe,开启服务。具体的代码如下:

ICalculate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;namespace IService
{[ServiceContract]public interface ICalculate{[OperationContract]int Add(int a, int b);}
}

IUserInfo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;namespace IService
{[ServiceContract]public interface IUserInfo{[OperationContract]User[] GetInfo(int? id);}[DataContract]public class User{[DataMember]public int ID { get; set; }[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public string Nationality { get; set; }  }
}

注:必须引入System.Runtime.Serialization命名空间,应为User类在被传输时必须是可序列化的,否则将无法传输

Calculate.cs

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Service
{public class Calculate : ICalculate{public int Add(int a, int b){return a + b;}}
}

UserInfo.cs

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Service
{public class UserInfo : IUserInfo{public User[] GetInfo(int? id){List<User> Users = new List<User>();Users.Add(new User { ID = 1, Name = "张三", Age = 11, Nationality = "China" });Users.Add(new User { ID = 2, Name = "李四", Age = 12, Nationality = "English" });Users.Add(new User { ID = 3, Name = "王五", Age = 13, Nationality = "American" });if (id != null){return Users.Where(x => x.ID == id).ToArray();}else{return Users.ToArray();}}}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service;
using System.ServiceModel;namespace Host
{class Program{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(Calculate))){host.Opened += delegate { Console.WriteLine("服务已经启动,按任意键终止!"); };host.Open();Console.Read();}}}
}

App.Config

<?xml version="1.0"?>
<configuration><system.serviceModel><services><service name="Service.Calculate" behaviorConfiguration="mexBehavior"><host><baseAddresses><add baseAddress="http://localhost:1234/Calculate/"/></baseAddresses></host><endpoint address="" binding="wsHttpBinding" contract="IService.ICalculate" /><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/></service></services><behaviors><serviceBehaviors><behavior name="mexBehavior"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="true"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
</configuration>

ok,打开Host.exe

服务开启成功!

2、新建名为Client的客户端控制台程序,通过添加引用的方式,异步调用WCF服务

添加添加对服务终结点地址http://localhost:6666/UserInfo/的引用,设置服务命名空间为UserInfoServiceNS,点击高级设置,勾选生成异步操作选项,生成客户端代理类和配置文件代码后,完成Client对服务的调用.

ok,开始编写program.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Client.UserInfoServiceNS;namespace Client
{class Program{static void Main(string[] args){UserInfoClient proxy = new UserInfoClient();proxy.GetInfoCompleted += new EventHandler<GetInfoCompletedEventArgs>(proxy_GetInfoCompleted);//注册proxy_GetInfoCompleted到proxy.GetInfoCompleted中proxy.GetInfoAsync(null);//开始异步调用Console.WriteLine("此字符串在调用方法前输出,说明异步调用成功!");Console.Read();}static void proxy_GetInfoCompleted(object sender, GetInfoCompletedEventArgs e){User[] Users = e.Result.ToArray();Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}", "ID", "Name", "Age", "Nationality");for (int i = 0; i < Users.Length; i++){Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}",Users[i].ID.ToString(),Users[i].Name.ToString(),Users[i].Age.ToString(),Users[i].Nationality.ToString());}}}
}

从上面的代码可以看出WCF服务端和WCF客户端采用了事件驱动机制,也就是所谓的发布-订阅模式,不了解的话,请参考本人的C# 委托,当proxy.GetInfoAsync(null)从服务端获取数据成功之后,即开始执行EventHandler<T>上绑定的方法.

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

通过参数类型TEventArgsResult可以获得返回结果

User[] Users = e.Result.ToArray();

三、通过svcutil生成客户端代理类,并通过重写客户端的服务契约,完成对服务端服务的异步吊用

新建名为Client1的客户端控制台程序,通过svcutil.exe工具生成的客户端代理类,,异步调用WCF服务

(1)、打开cmd,输入cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

(2)、输入svcutil.exe   /out:f:\UserInfoClient.cs  /config:f:\App.config  http://localhost:6666/UserInfo/  /a  /tcv:Version35

ok,生成成功

(5)、将生成的文件拷贝到项目中,引入System.Runtime.Serialization命名空间和System.ServiceModel命名空间

(6)、剩下的步骤和上面的一样

转载于:https://www.cnblogs.com/GreenLeaves/p/6861590.html

WCF系列教程之客户端异步调用服务相关推荐

  1. AjaxPro.NET使用,方便的在客户端直接调用服务端方法

    (一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...

  2. 王姨劝我学HarmonyOS鸿蒙2.0系列教程之三Ability概述调用方法!

    原创PDF |<Android 深入系统完全讲解>免费开源,可能价值百万! 王姨劝我学HarmonyOS鸿蒙2.0系列教程之一环境搭建&&跑起来模拟器! 王姨劝我学Harm ...

  3. RemObjects(一)客户端远程调用服务端接口过程

    RemObjects SDK 是高度封装的产物,对OOP发挥极致. 本文将以RemObjects SDK最简单的DEMO--FirstSample为例, 介绍客户端是如何完成远程调用服务端接口的全过程 ...

  4. 无废话WCF系列教程 -- 李林峰

    李林峰的无废话WCF入门教程 无废话WCF入门教程一[什么是WCF] 无废话WCF入门教程二[WCF应用的通信过程] 无废话WCF入门教程三[WCF的宿主] 无废话WCF入门教程四[WCF的配置文件] ...

  5. SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...

  6. Web Service 客户端,调用服务方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 只是最简单的调用web  service  服务,至于要传什么参数全看到业务了. 以下是最简单的调用 ...

  7. twisted系列教程十一 — 一个twisted 的服务端

    A Twisted Poetry Server 既然我们已经学了这么多twisted client 的编写,现在让我们来用twisted来重新实现一下我们的poetry server 吧.我们要多谢谢 ...

  8. ES 8.x 系列教程:ES 8.0 服务安装(可能是最详细的ES 8教程)

    文章目录 1.开发环境操作系统 1.1 选择Windows.Mac or Linux 1.2 选择虚拟机还是本地安装 2.学习ES 8 Java版本如何选择 2.1 ES与JDK兼容性 2.2 Jav ...

  9. WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端

    WCF客户端可以调用任何基于标准的服务而不用考虑目标宿主环境.在.NET Framework 1.1 上创建的ASMX网络服务是完全兼容的.由WS-I 1.1基本概况定义的标准确保它们可以被WCF调用 ...

  10. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

最新文章

  1. python中sorted和.sorted 、reversed和reverse的使用
  2. java.lang.NoSuchMethodError: android.os.Bundle.getString
  3. windows dos 常用命令
  4. 关于NSKeyedArchiver的编码格式
  5. long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)
  6. NDPQ(NDP+PQ),定义分布式数据库新方向
  7. python 把函数作为参数 ---高阶函数
  8. RabbitMQ教程_4 Java 使用rabbitmq
  9. Java AtomicInteger类源码解析
  10. mysql存储引擎分类
  11. 关于VLAN的几种接口模式
  12. 串口485接法图_rs485通讯接口定义图详解
  13. IFIX组态-----通过按钮弹出、关闭子画面
  14. mysql过期数据_mysql过期数据如何删除
  15. 怎么在线预览.doc,.docx,.ofd,.pdf,.wps,.cad文件以及Office文档的在线解析方式。
  16. 爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
  17. RuntimeError: grad can be implicitly created only for scalar outputs
  18. javaweb JAVA JSP运动会管理系统JSP运动会成绩管理系统 JSP校运会报名信息管理系统
  19. 价值创造链路及经营计划
  20. 局域网内的计算机拒绝访问,win10系统局域网拒绝访问的解决方法

热门文章

  1. html5 sha1,JavaScript 实现的base64加密、md5加密、sha1加密及AES加密
  2. 为什么年龄大了近视还增加_都是做近视手术,为什么价格区别这么大?
  3. cad相对坐标快捷键_CAD入门必记的15个命令,只要熟悉这15个命令几乎就可以走遍天下...
  4. sql分别对两列数据求和以不同的条件_利用数组与字典,实现双条件数据汇总的方法...
  5. Spring Cloud学习笔记---Spring Cloud Sleuth--一个手动搭建zipkin碰到的坑
  6. 正则表达式 Java
  7. 目标追踪论文之狼吞虎咽(5):基于张量的图嵌入半监督学习及其在判别式目标追踪的应用
  8. 数据库基础(4)函数依赖公理和推论(Armstrong公理),属性闭包和求候选键的技巧
  9. 动手试试Android Studio插件开发
  10. 读论文看到的好的英文词句表达