`
北极的。鱼
  • 浏览: 152644 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】WCF简单教程(11) REST调用

    博客分类:
  • WCF
 
阅读更多

转自: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。

 

分享到:
评论

相关推荐

    Android调用WCFRest(博客源码)

    涉及到的知识点:1.WCFRest实现基础(WCFRest后面单独讲,没接触过的,就根据我的例子依葫芦画瓢,到实际要用时再研究不迟);2.Http的Get和Post请求;3.页面跳转传值;4.实体类对象与Json字符串的互转;5.子线程中...

    WCF系列教程源码,WCF入门教程

    全套WCF源码 ...:契约, 绑定, 宿主, 异常处理, 异步调用, 双向通讯, MTOM, 流数据传输, 序列化, 实例模型, 会话状态, 并发, 限流, 事务, 安全, 可靠性消息, 消息队列, WCF创建REST, AJAX调用WCF

    WCFRest应用简介(博客源码)

    1.采用模板实现WCFRest;2.采用一般WCF服务的方式实现WCFRest以及客户端的调用。博客地址:http://blog.csdn.net/pfe_nova/article/details/39323977

    .NET下rest 风格的服务 内含WCF和 web API 两种方式的demo

    .NET下rest 风格的服务 内含WCF和 web API 两种方式的demo.由于可能给同事讲解,因此不收分了。

    实现WCF同时支持SOAP和AJAX跨域调用(支持代理启动)

    1、基于WCF框架对REST架构的WEB(支持SOAP)服务实现; 2、支持javascript的多种方式跨域访问(GET/POST/PUT/DELETE); 3、解决服务调用参数传递的动态设计数据格式(XML/JSON); 4、同时支持AJAX和SOAP进行调用...

    WCF 全面解析第三节pdf

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析01

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析 下册

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF与Ajax开发实践--构建REST WCF 讲义、Demo和专题讲座

    WCF与Ajax开发实践--构建REST WCF 讲义、Demo和专题讲座,对于javaScript如何调用WCF很有帮助的文档。

    WCF全面解析07

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析(源码)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析(套装上下册) 高清pdf 带书签part1(共4)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析(套装上下册) 高清pdf 带书签 part2(共4)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析(下册)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    wcf 全面解析(上)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和rest服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站vm,它将指导你...

    WCF全面解析(上册)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    WCF全面解析(套装上下册) 高清pdf 带书签 part3(共4)

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

    解析Silverlight调用WCF/Rest异常的解决方法

    本篇文章对Silverlight调用WCF/Rest异常的解决方法进行了详细的分析介绍,需要的朋友参考下

    WCF全面解析05

    第7、8章讲述了在服务寄宿和操作调用过程中,WCF的服务端和客户端框架分别为我们做了什么;第9、10章将介绍的重点落在实例化、会话和REST服务上面;在最后一章中采用WCF构建了一个具体的电子商务网站VM,它将指导你...

Global site tag (gtag.js) - Google Analytics