转自:http://boytnt.blog.51cto.com/966121/860724
第十一篇:REST调用
上篇写的是Ajax调用WCF,今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学,可以去google一下。对某些类型的应用,REST还是相当不错的方式,所以专门写一篇来说明一下开发方法。
老规矩,上代码,直接在代码注释里讲解。
1、服务端:
服务契约,我们定义CRUD4个方法(增查改删),对应HTTP METHOD分别为PUT/GET/POST/DELETE:
using System; using System.ServiceModel; using System.ServiceModel.Web; //这个命名空间要求引入System.ServiceModel.Web.dll namespace Server { [ServiceContract(Namespace = "WCF.Demo")] public interface IData { //WebInvoke中标明REST的相关属性,以这个方法为例,调用的Url是 ..../Data/key/data,HTTP方法是PUT,响应为Json格式(也可以换成xml) //这样如果客户端用PUT方法访问 ..../Data/1/100,就会映射到CreateData方法上来,并且传入key=1,data=100 [OperationContract] [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "PUT", ResponseFormat = WebMessageFormat.Json)] void CreateData(string key, string data); [OperationContract] [WebInvoke(UriTemplate = "Data/{key}", Method = "GET", ResponseFormat = WebMessageFormat.Json)] string RetrieveData(string key); [OperationContract] [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] void UpdateData(string key, string data); [OperationContract] [WebInvoke(UriTemplate = "Data/{key}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)] void DeleteData(string key); } }
然后是实现类,这个简单,没什么可说的。
using System; using System.Collections.Generic; using System.ServiceModel; namespace Server { //这个例子中用了Single Instance模式,这样m_DataDict的值才能保留住 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class DataProvider : IData { private Dictionary<string, string> m_DataDict = new Dictionary<string, string>(); public void CreateData(string key, string data) { m_DataDict[key] = data; } public string RetrieveData(string key) { return m_DataDict.ContainsKey(key) ? m_DataDict[key] : "NOT FOUND"; } public void UpdateData(string key, string data) { m_DataDict[key] = data; } public void DeleteData(string key) { m_DataDict.Remove(key); } } }
配置文件最关键了,注意里面绿色的注释部分:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Server.DataProvider"> <!--必须使用webHttpBinding,而且要定义此endpoint的behaviorConfiguration(见后)--> <endpoint address="" binding="webHttpBinding" contract="Server.IData" behaviorConfiguration="restBehavior" /> <host> <baseAddresses> <add baseAddress="http://localhost:8080/wcf" /> </baseAddresses> </host> </service> </services> <behaviors> <!--定义endpoint的behavior,webHttp节点表示启用web方式访问,这对REST是非常关键的--> <endpointBehaviors> <behavior name="restBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration>
最后发布服务,没什么特殊的,和以前一样:
using System; using System.ServiceModel; namespace Server { class Program { static void Main(string[] args) { using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider))) { host.Open(); Console.WriteLine("Running ..."); Console.ReadKey(); host.Close(); } } } }
这个服务端没有用IIS做HOST,直接用自己的进程做的宿主(当然了,本质还是http.sys在工作)。
2、客户端
我们这回要用REST形式访问服务端,所以不是普通意义上的WCF客户端了,再也用不着那么麻烦的写配置文件创建Channel或者代理了。
using System; using System.Net; namespace Client { class Program { static void Main(string[] args) { //用一个WebClient就可以搞定了 var client = new WebClient(); //以PUT方式访问Data/1/100,会映射到服务端的CreateData("1", "100") client.UploadString("http://localhost:8080/wcf/Data/1/100", "PUT", string.Empty); //以GET方式访问Data/1,会映射到服务端的RetrieveData("1"),应该返回"100" Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); //以POST方式访问Data/1/200,会映射到服务端的UpdateData("1", "200") client.UploadString("http://localhost:8080/wcf/Data/1/200", "POST", string.Empty); //再GET一次,应该返回"200" Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); //以DELETE方式访问Data/1,会映射到服务端的DeleteData("1") client.UploadString("http://localhost:8080/wcf/Data/1", "DELETE", string.Empty); //再GET一次,应该返回"NOT FOUND" Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); } } }
OK,运行一下客户端,返回如下,和预期一致:
需要补充一下,如果用IIS做HOST,比如DataService.svc.cs是实现类,一定要在DataService.svc中加上Factory,如下:
<%@ ServiceHost Language="C#" Debug="true" Service="WebServer.DataService" CodeBehind="DataService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
表明不是使用默认的ServiceHostFactory,而是适应WEB HTTP开发的WebServiceHostFactory。
相关推荐
对于客户端,调用WCF服务可以通过两种主要方式:使用代理类(基于WSDL的SOAP调用)和使用`WebChannelFactory`(基于HTTP的REST调用)。这里我们关注后者,因为描述中提到了POST和GET请求。 #### a. **GET请求** ...
涉及到的知识点:1.WCFRest实现基础(WCFRest后面单独讲,没接触过的,就根据我的例子依葫芦画瓢,到实际要用时再研究不迟);2.Http的Get和Post请求;3.页面跳转传值;4.实体类对象与Json字符串的互转;5.子线程中...
在“JingyuanYu_ReservationClient”客户端代码中,通常会使用`HttpClient`或者WCF的`ChannelFactory`来发送HTTP请求,调用服务端的REST接口。客户端需要构造符合服务端`UriTemplate`的URL,并设置正确的HTTP方法,...
全套WCF源码 ...:契约, 绑定, 宿主, 异常处理, 异步调用, 双向通讯, MTOM, 流数据传输, 序列化, 实例模型, 会话状态, 并发, 限流, 事务, 安全, 可靠性消息, 消息队列, WCF创建REST, AJAX调用WCF
在IT行业中,Windows Communication Foundation(WCF)是微软推出的一种用于构建分布式应用程序的服务框架,它集成了多种通信协议,如SOAP(简单对象访问协议)和REST(Representational State Transfer)。...
安装**WcfRestService40(CS).vsix** 文件后,用户在Visual Studio 2010中就可以直接创建符合RESTful原则的服务,从而提高开发效率。 **WCF REST服务的关键概念:** 1. **服务合同(Service Contract)**:定义了...
1.采用模板实现WCFRest;2.采用一般WCF服务的方式实现WCFRest以及客户端的调用。博客地址:http://blog.csdn.net/pfe_nova/article/details/39323977
本实例将详细介绍如何通过WCF实现客户端调用服务端的服务。 ### 1. WCF服务的创建与配置 首先,我们需要在服务端创建一个WCF服务。这通常涉及到以下步骤: 1. **创建Service Contract**: 定义服务接口,即`.svc`...
总结起来,WCF REST服务在ASP.NET中的应用提供了一种高效、灵活的方式来构建Web API,使得开发人员能够快速创建面向资源的、基于HTTP的接口,便于客户端(如JavaScript应用、移动应用等)调用。通过理解并掌握这些...
本教程将通过实例演示如何创建一个简单的WCF服务,并在客户端调用这个服务。对于初学者来说,这将是一个很好的起点,帮助理解WCF的基础知识,为进一步深入学习和应用打下坚实的基础。通过不断实践和学习,你将能够...
在REST模式下,WCF可以创建符合REST原则的服务。在"MyRESTService.zip"这个压缩包中,可能包含了一个使用WCF实现的REST服务示例。创建RESTful WCF服务通常涉及以下步骤: - 定义服务接口,使用OperationContract...
在IT行业中,Web服务是应用程序之间进行通信的一种方式,而WCF(Windows Communication Foundation)和REST(Representational State Transfer)是两种常见的Web服务技术。本文将深入探讨这两种服务的实现,以及它们...
### 八、WCF与SOAP和REST 1. **SOAP**: WCF默认使用SOAP协议,支持WS-*标准,适合企业级应用。 2. **RESTful服务**: WCF 4.0引入WebHttpBinding,支持RESTful风格,更适合互联网应用。 ### 学习资源 文档《C#_WCF...
### PB 12.5 调用 REST:详解与实践 #### 一、引言 随着技术的发展,PowerBuilder 12.5 .NET 版本新增了使用 WCF (Windows Communication Foundation) 调用 RESTful Web 服务的能力。这一特性极大地扩展了 Power...
在这个“WCF服务简单实例”中,我们将会深入探讨如何创建一个基本的服务端程序,以及如何使用C#客户端来调用这个服务。 1. **WCF基础概念**:WCF是一个全面的服务模型,它融合了Web服务、COM+、MSMQ等多种通信机制...
- 配置文件:可能有针对WCF服务调用的特定配置,如SOAP或REST的设置。 在实际应用中,确保正确配置了服务端的安全设置(如认证、SSL/TLS)和客户端的信任,以便安全地进行跨平台通信。此外,性能优化也很重要,例如...
在本示例中,我们将深入探讨如何利用MEF实现应用模块之间的解耦,以及如何将WCF(Windows Communication Foundation)与REST(Representational State Transfer)扩展相结合,创建一个基础的服务架构。 首先,MEF...
### 使用WCF开发REST服务:全面解析与实践指南 #### 关于HTTP与REST的初步探讨 REST(Representational State Transfer)是一种设计风格,用于构建基于HTTP协议的网络互联系统。它强调通过简单的规则和原则来创建...
本实例主要探讨的是如何在Silverlight应用程序中调用WCF服务,以及解决由此产生的跨域问题。 ### WCF服务宿主 WCF服务可以宿主在多种环境中,常见的有: 1. **自承载(Self-Host)**:开发者可以在自己的应用程序...