jillzhang

专注才能专业

随笔- 241  文章- 0  评论- 4257 
博客园  首页  新随笔  联系  管理  订阅 订阅

异步调用Restful的WCF服务

上周在pedramr blog上看到有人问是否能够异步调用Restful的WCF服务,下面便是具体实现异步调用Restful的WCF实现细节。通过本文的学习,有助于如下知识的掌握:

  1. 如何设定WCF的Restful支持
  2. 如何异步调用Restful的WCF服务

第一步:创建一个解决方案:AsyCallRestfulWcf,该解决方案包含下面四个项目:

项目名称

备注

AsyCallRestfulWcf.Contracts

WCF服务的契约项目,包含服务契约和数据契约的定义

AsyCallRestfulWcf.Service

WCF服务的具体实现    

AsyCallRestfulWcf.Host

WCF服务的承载

AsyCallRestfulWcf.HttpClient

用Http 的方式异步调用WCF服务客户端

 

第二步:在项目AsyCallRestfulWcf.Contracts中创建服务契约IService.cs和数据契约Person.cs

Person.cs

Person.cs
using System; 

using
 System.Collections.Generic; 

using
 System.Text; 

using
 System.Xml.Serialization; 

using
 System.Runtime.Serialization; 

 

namespace
 AsyCallRestfulWcf.Contracts 

{ 

[DataContract] 

public class
 Person 

{ 

[DataMember] 

public string
 ID 

{ 

get
; 

set
; 

}
 

[DataMember] 

public string
 Name 

{ 

get
; 

set
; 

}
 

[DataMember] 

public int
 Age 

{ 

get
; 

set
; 

}
 

}
 

}
 

IService.cs 

IService.cs
using System; 

using
 System.Collections.Generic;  

using
 System.Text; 

using
 System.ServiceModel; 

 

namespace
 AsyCallRestfulWcf.Contracts 

{ 

[ServiceContract] 

public interface
 IService 

{ 

[OperationContract] 

Person GetPerson(
string
 id); 

}
 

}
 

 


第三步:在项目AsyCallRestfulWcf.Service中创建服务实现类Service.cs

Service.cs  

Service.cs
using System; 

using
 System.Collections.Generic; 

using
 System.Text; 

using
 System.ServiceModel.Web; 

 

namespace
 AsyCallRestfulWcf.Service 

{ 

public class
 Service:Contracts.IService 

{ 

[WebInvoke(Method 
= "*", UriTemplate = "GetPerson?id={id}"
)] 

public Contracts.Person GetPerson(string
 id) 

{ 

System.Threading.Thread.Sleep(
5000
); 

Contracts.Person p 
= new
 AsyCallRestfulWcf.Contracts.Person(); 

p.ID 
=
 id; 

p.Name 
= "jillzhang"
; 

p.Age 
= 25
; 

return
 p; 

}
 

}
 

}
 

在服务方法中,用System.Threading.Thread.Sleep(5000);模拟一个比较耗时的操作  

第四步 实现WCF服务的承载项目:AsyCallRestfulWcf.Host

添加一个应用程序配置文件app.config和代码文件Programe.cs

App.config 

App.config
<?xml version="1.0" encoding="utf-8" ?> 

<configuration>
 

<system.serviceModel>
 

<services>
 

<service name="AsyCallRestfulWcf.Service.Service">
 

<host>
 

<baseAddresses>
 

<add baseAddress="http://locahost"/>
 

</baseAddresses>
 

</host>
 

<endpoint address="" binding="webHttpBinding" contract="AsyCallRestfulWcf.Contracts.IService"
 

behaviorConfiguration
="RestfulBehavior" name="webHttpBinding">
 

</endpoint>
 

</service>
 

</services>
 

<behaviors>
 

<endpointBehaviors>
 

<behavior name="RestfulBehavior">
 

<webHttp/>
 

<synchronousReceive/>
 

</behavior>
 

</endpointBehaviors>
 

</behaviors>
 

</system.serviceModel>
 

</configuration>
 

Programe.cs  

Programe.cs
using System; 

using
 System.Collections.Generic; 

using
 System.Text; 

using
 System.ServiceModel; 

 

namespace
 AsyCallRestfulWcf.Host 

{ 

public class
 Programe 

{ 

protected static void
 Main() 

{ 

using (ServiceHost host = new ServiceHost(typeof
(Service.Service))) 

{ 

host.Open(); 

Console.WriteLine(
"服务已经启动!"
); 

Console.Read(); 

}
 

 

}
 

}
 

}
 

在App.config中,要使WCF支持Restful,要使用的binding是webHttpBinding

第五步:实现异步调用的客户端:AsyCallRestfulWcf.HttpClient

添加windows窗体Form1.

后台代码为:  

Form1.cs
using System; 

using
 System.Collections.Generic; 

using
 System.ComponentModel; 

using
 System.Data; 

using
 System.Drawing; 

using
 System.Linq; 

using
 System.Text; 

using
 System.Windows.Forms; 

 

namespace
 AsyCallRestfulWcf.HttpClient 

{ 

public partial class
 Form1 : Form 

{ 

public
 Form1() 

{ 

InitializeComponent(); 

}
 

System.Net.WebClient wc; 

private void button1_Click(object
 sender, EventArgs e) 

{ 

wc 
= new
 System.Net.WebClient(); 

wc.DownloadStringAsync(
new Uri("http://localhost/GetPerson?id=1"
)); 

wc.DownloadStringCompleted 
+= new
 System.Net.DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); 

button1.Enabled 
= false
; 

button2.Enabled 
= true
; 

}
 

 

void wc_DownloadStringCompleted(object
 sender, System.Net.DownloadStringCompletedEventArgs e) 

{ 

if (!
e.Cancelled) 

{ 

string content =
 e.Result; 

richTextBox1.Text 
=
 content; 

button1.Enabled 
= true
; 

button2.Enabled 
= false
; 

}
 

}
 

 

private void button2_Click(object
 sender, EventArgs e) 

{ 

wc.CancelAsync(); 

button1.Enabled 
= true
; 

button2.Enabled 
= false
; 

richTextBox1.Text 
= "请求已经取消!"
; 

}
 

}
 

}
 

现在就可以调试浏览了,将解决方案设置成多启动的、  

  

然后F5,出现下面的界面  

 和  

 表明运行正常  

点击开始调用,等待几秒后,下面的文本框便出现文字

在开始调用之后,点击取消调用可以取消请求  

国际惯例,项目代码:

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Restful,WCF
posted @ 2008-07-12 13:32 jillzhang 阅读(1526) 评论(14)  编辑 收藏 所属分类: WCF
发表评论
  回复  引用  查看    
2008-07-12 14:20 | TerryLee      
支持老张!
  回复  引用  查看    
2008-07-12 14:26 | jillzhang      
@TerryLee
多谢支持,;)
  回复  引用    
2008-07-12 14:49 | homeart [未注册用户]
不错,http://www.homeart88.cn专业效果图制作,教程,模型,免费学习资料
  回复  引用  查看    
2008-07-12 14:54 | 生鱼片      
我也支持下
  回复  引用  查看    
2008-07-12 16:22 | jillzhang      
@生鱼片
多谢支持
  回复  引用    
2008-07-12 19:18 | XXxx [未注册用户]
用WCF做企业开发,我们更注重他的业务编程,还是别的??
  回复  引用  查看    
2008-07-12 21:10 | JesseZhao      
来支一下
  回复  引用  查看    
2008-07-12 21:54 | jillzhang      
@XXxx
当然最重要的还是业务了
但框架的东西也要关注,因为他是业务能够得以表现的载体
对于他的熟悉度会直接的影响到业务逻辑的表达能力和实现的巧妙性
  回复  引用  查看    
2008-07-12 22:01 | 李涛      
路过

楼主如此之细心,佩服 !
  回复  引用  查看    
2008-07-12 22:03 | jillzhang      
@李涛
多谢支持
我不怎么细心呀,比较粗心的

  回复  引用  查看    
2008-07-13 07:23 | 姜敏      
好文,不过想问下队长,为什么一打开您的文章就会弹出下载项目的提示呢?是做了什么特别的处理吗?哈哈
  回复  引用  查看    
2008-07-13 08:22 | jillzhang      
@姜敏
这个是 TerryLee 教我的方法

用skydrive就有这种效果
  回复  引用  查看    
2008-07-13 10:10 | 王孟军!      
路过,支持...
公司高层,想把原有系统的服务层全部改成WCF,不晓得楼主有何高见?
  回复  引用  查看    
2008-08-30 14:56 | 张宏宇      
请教一个。WCF在internt 中用网站调用,为什么调用了呀,需要身份验证服务。验证,必须得用x509证书吗。有没有别的解决方案!
新用户注册  刷新评论列表  

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-08-28 22:27 编辑过
成果网帮您增加网站收入

相关文章:
把Membership,Role包装为WCF服务
用Restful方式调用WCF进行上传下载
[原创]我的WCF之旅(1):创建一个简单的WCF程序
Host多个WCF服务(Self-host)
利用 Remoting 实现异步队列机制
不要在WCF service中使用TypedDataset或DataTable作为数据传输载体

相关链接:

所属分类的其他文章:
WCF从理论到实践系列文章索引
【封装】WCF+LINQ+ExtJS做更简单的Grid
[添砖加瓦]:ExtJS+WCF+LINQ打造全功能Grid
WCF生成客户端对象方式解析
再说ExtJs与WCF之间的跨域访问
用Restful方式调用WCF进行上传下载
异步调用Restful的WCF服务
ExtJs与WCF之间的跨域访问
ExtJs+WCF+LINQ实现分页Grid
用ExtJs+Linq+Wcf打造简单grid

最新IT新闻:
淘宝与微软总部达成首次合作 Silverlight加入店铺
苹果9日发布iTunes 8、iPhone 2.1和第四代iPod Nano
微软出品8GB蓝色和120GB Zune播放器
千亿美元市值榜:微软居首移动第二 诺基亚退榜
Google申请“海上数据中心”专利 可能付诸行动