热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WCFREST调用

REST调用上篇写的是Ajax调用WCF,今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学,可以去google一下。对某些类型的应用,REST还是相当不错的方

 

REST调用

>上篇写的是Ajax调用WCF,今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学,可以去google一下。对某些类型的应用,REST还是相当不错的方式,所以专门写一篇来说明一下开发方法。

老规矩,上代码,直接在代码注释里讲解。


1、服务端:

服务契约,我们定义CRUD4个方法(增查改删),对应HTTP
METHOD分别为PUT/GET/POST/DELETE:



  1. class="keyword">using System; 

  2. class="keyword">using System.ServiceModel; 

  3. class="keyword">using System.ServiceModel.Web; 
    //这个命名空间要求引入System.ServiceModel.Web.dll

  4.  

  5. class="keyword">namespace Server 


  6. class="alt">    [ServiceContract(Namespace =  class="string">"WCF.Demo")] 

  7.      class="keyword">public  class="keyword">interface IData 

  8.     { 

  9.         //WebInvoke中标明REST的相关属性,以这个方法为例,调用的Url是 ..../Data/key/data,HTTP方法是PUT,响应为Json格式(也可以换成xml) 

  10.          class="comment">//这样如果客户端用PUT方法访问 ..../Data/1/100,就会映射到CreateData方法上来,并且传入key=1,data=100 

  11.         [OperationContract] 

  12. class="alt">        [WebInvoke(UriTemplate =  class="string">"Data/{key}/{data}", Method =  class="string">"PUT", ResponseFormat = WebMessageFormat.Json)] 

  13.         void CreateData( class="keyword">string key, string data); 

  14.  

  15.         [OperationContract] 

  16. class="alt">        [WebInvoke(UriTemplate =  class="string">"Data/{key}", Method =  class="string">"GET", ResponseFormat = WebMessageFormat.Json)] 

  17.         string RetrieveData( class="keyword">string key); 

  18.  

  19.         [OperationContract] 

  20. class="alt">        [WebInvoke(UriTemplate =  class="string">"Data/{key}/{data}", Method =  class="string">"POST", ResponseFormat = WebMessageFormat.Json)] 

  21.         void UpdateData( class="keyword">string key, string data); 

  22.  

  23.         [OperationContract] 

  24. class="alt">        [WebInvoke(UriTemplate =  class="string">"Data/{key}", Method =  class="string">"DELETE", ResponseFormat = WebMessageFormat.Json)] 

  25.         void DeleteData( class="keyword">string key); 

  26.     } 

然后是实现类,这个简单,没什么可说的。



  1. class="keyword">using System; 

  2. class="keyword">using System.Collections.Generic; 

  3. class="keyword">using System.ServiceModel; 

  4.  

  5. class="keyword">namespace Server 


  6.      class="comment">//这个例子中用了Single Instance模式,这样m_DataDict的值才能保留住 

  7.     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

  8.      class="keyword">public  class="keyword">class DataProvider : IData 

  9.     { 

  10.          class="keyword">private Dictionary<string class="keyword">string> m_DataDict =  class="keyword">new Dictionary<string class="keyword">string>(); 

  11.  

  12.          class="keyword">public  class="keyword">void CreateData( class="keyword">string key, string data) 

  13.         { 

  14. class="alt">            m_DataDict[key] = data; 

  15.         } 

  16.  

  17.         public  class="keyword">string RetrieveData(string key) 

  18. class="alt">        { 

  19.              class="keyword">return m_DataDict.ContainsKey(key) ? m_DataDict[key] :  class="string">"NOT FOUND"

  20. class="alt">        } 

  21.  

  22.          class="keyword">public  class="keyword">void UpdateData( class="keyword">string key, string data) 

  23.         { 

  24. class="alt">            m_DataDict[key] = data; 

  25.         } 

  26.  

  27.         public  class="keyword">void DeleteData( class="keyword">string key) 

  28. class="alt">        { 

  29.             m_DataDict.Remove(key); 

  30. class="alt">        } 

  31.     } 

配置文件最关键了,注意里面绿色的注释部分:



  1. class="tag-name">xml  class="attribute">version= class="attribute-value">"1.0"  class="attribute">encoding= class="attribute-value">"utf-8"  class="tag">?> 

  2. < class="tag-name">configuration class="tag">> 

  3.      class="tag"><system.serviceModel class="tag">> 

  4.          class="tag"><services class="tag">> 

  5. class="alt">             class="tag">< class="tag-name">service  class="attribute">name= class="attribute-value">"Server.DataProvider" class="tag">> 

  6.           

  7. class="alt">                 class="tag">< class="tag-name">endpoint  class="attribute">address= class="attribute-value">""  class="attribute">binding= class="attribute-value">"webHttpBinding" contract= class="attribute-value">"Server.IData" behaviorConfiguration= class="attribute-value">"restBehavior" /> 

  8.                  class="tag"><host class="tag">> 

  9. class="alt">                     class="tag"><baseAddresses> 

  10.                          class="tag">< class="tag-name">add  class="attribute">baseAddress="http://localhost:8080/wcf"  class="tag">/> 

  11. class="alt">                     class="tag">baseAddresses class="tag">> 

  12.                  class="tag">host class="tag">> 

  13. class="alt">             class="tag">service class="tag">> 

  14.          class="tag">services> 

  15.  

  16.          class="tag"><behaviors> 

  17.         
    class="comments"> 

  18.              class="tag"><endpointBehaviors class="tag">> 

  19. class="alt">                 class="tag">< class="tag-name">behavior  class="attribute">name= class="attribute-value">"restBehavior" class="tag">> 

  20.                      class="tag"><webHttp class="tag">/> 

  21. class="alt">                 class="tag">behavior> 

  22.              class="tag">endpointBehaviors class="tag">> 

  23.          class="tag">behaviors> 

  24.     system.serviceModel class="tag">> 

  25. class="tag-name">configuration class="tag">> 

最后发布服务,没什么特殊的,和以前一样:



  1. class="keyword">using System; 

  2. class="keyword">using System.ServiceModel; 

  3.  

  4. class="keyword">namespace Server 


  5.      class="keyword">class Program 

  6.     { 

  7.         static  class="keyword">void Main( class="keyword">string[] args) 

  8. class="alt">        { 

  9.              class="keyword">using(ServiceHost host =  class="keyword">new ServiceHost( class="keyword">typeof(Server.DataProvider))) 

  10. class="alt">            { 

  11.                 host.Open(); 

  12. class="alt">                Console.WriteLine( class="string">"Running ..."); 

  13.                 Console.ReadKey(); 

  14. class="alt">                host.Close(); 

  15.             } 

  16. class="alt">        } 

  17.     } 

>这个服务端没有用IIS做HOST,直接用自己的进程做的宿主(当然了,本质还是http.sys在工作)。

 


2、客户端

>我们这回要用REST形式访问服务端,所以不是普通意义上的WCF客户端了,再也用不着那么麻烦的写配置文件创建Channel或者代理了。
class="Apple-style-span">



  1. class="keyword">using System; 

  2. class="keyword">using System.Net; 

  3.  

  4. class="keyword">namespace Client 


  5.      class="keyword">class Program 

  6.     { 

  7.         static  class="keyword">void Main( class="keyword">string[] args) 

  8. class="alt">        { 

  9.          //用一个WebClient就可以搞定了 

  10. class="alt">            var client =  class="keyword">new WebClient(); 

  11.  

  12.      class="comment">//以PUT方式访问Data/1/100,会映射到服务端的CreateData("1", "100") 

  13.      client.UploadString("http://localhost:8080/wcf/Data/1/100" class="string">"PUT" class="keyword">string.Empty); 

  14.  

  15.      class="comment">//以GET方式访问Data/1,会映射到服务端的RetrieveData("1"),应该返回"100" 

  16.    
     Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1")); 

  17.  

  18.       class="comment">//以POST方式访问Data/1/200,会映射到服务端的UpdateData("1", "200")             

  19.     client.UploadString( class="string">"http://localhost:8080/wcf/Data/1/200" class="string">"POST" class="keyword">string.Empty); 

  20.  

  21.       class="comment">//再GET一次,应该返回"200" 

  22.   
      Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1")); 

  23.  

  24.       class="comment">//以DELETE方式访问Data/1,会映射到服务端的DeleteData("1") 

  25.      client.UploadString("http://localhost:8080/wcf/Data/1" class="string">"DELETE" class="keyword">string.Empty); 

  26.  

  27.       class="comment">//再GET一次,应该返回"NOT FOUND" 

  28.        
     Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1")); 

  29.         } 

  30.     } 

 

 

>需要补充一下,如果用IIS做HOST,比如DataService.svc.cs是实现类,一定要在DataService.svc中加上Factory,如下:



  1. <%@ ServiceHost Language= class="string">"C#" Debug= class="string">"true" Service= class="string">"WebServer.DataService" CodeBehind= class="string">"DataService.svc.cs" Factory= class="string">"System.ServiceModel.Activation.WebServiceHostFactory" %> 

表明不是使用默认的ServiceHostFactory,而是适应WEB
HTTP开发的WebServiceHostFactory。
>

 

 

本文出自 “兔子窝” 博客,请务必保留此出处http://boytnt.blog.51cto.com/966121/860724

WCF REST调用,布布扣,bubuko.com


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
Colorful_Dong
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有