共同学习了前面一些概念,终于开始正题了哈。RESTful的Web Service调用直观,返回的内容容易解析。这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名,返回完整个人信息。
下面我们一步步用WCF实现一个RESTful的Web Service。在这之后分别描述用普通Console程序host在本地,以及用IIS发布到网络。

1. Contract

namespace WcfRESTful{    [ServiceContract]    public interface IPersonRetriever    {        [OperationContract]        [WebGet(UriTemplate = "Persons/{name}", ResponseFormat = WebMessageFormat.Json)]        Person GetPerson(string name);    }

    [DataContract]    public class Person    {        [DataMember]        public string Name { get; set; }        [DataMember]        public int Age { get; set; }        [DataMember]        public DateTime Birthday { get; set; }    }}

这里需要注意的是在方法GetPerson()上面的WebGetAttribute:
1.1 WebGetAttribute定义了该方法的访问方式为RESTful的Get(关于RESTful可以参考本小博中关于REST介绍的文章)。
1.2 UriTemplet描述了URL匹配的格式,当格式匹配时,{name}位置的字符串会被对应传入为方法参数。
1.3 ResponseFormat指定了返回的数据格式,可选项为JSON和XML。

2. Contract实现

namespace WcfRESTful{    public class PersonRetriever : IPersonRetriever    {        public Person GetPerson(string name)        {            WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";            return new Person { Name = name, Age = 22, Birthday = DateTime.Now };        }    }}

这个实现里面,我们简单的返回一个用传入名参数为name的Person实例。这里补充一点:如果ContectType是"Text",如果返回结果串包含特别字符(比如转义,双引号,XML文件片段等),有些情况会在IE中解析不正常,造成字段缺失,目前没有找到相关资料说明IE解析规则。为了方便和谨慎起见,直接用"text/plain"。

3. 在Console中Host Service

在第1,2步的基础上,我们开始在console中host这个service。

namespace WcfRESTful{    class Program    {        static void Main(string[] args)        {            Uri baseAddress = new Uri("http://127.0.0.1:9998/PersonRetriever");            using (ServiceHost host = new ServiceHost(typeof(PersonRetriever), baseAddress))            {                WebHttpBinding binding = new WebHttpBinding();                ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IPersonRetriever), binding, baseAddress);                WebHttpBehavior httpBehavior = new WebHttpBehavior();                endpoint.Behaviors.Add(httpBehavior);                host.Opened += delegate                {                    Console.WriteLine("Hosted successfully.");                };                host.Open();                Console.ReadLine();            }        }    }}

让后我们通过URL:http://127.0.0.1:9998/PersonRetriever/Persons/Tom 就可以访问该Service了,其中"Tom"是需要查询的人名。在IE中输入该URL,回车之后的结果如下图:

4. 在IIS中Host Web Service

4.1新建一个WCF Service(或者Web Service依.Net Framework版本不同而定)工程,把第1,2步的Contract和实现Copy到App_Code文件夹下面。

4.2修改Service.svc - 注意,Factory="System.ServiceModel.Activation.WebServiceHostFactory"必须添加才可以直接在IE查看结果,但是Matedata将被屏蔽不能显示。

<%@ ServiceHost Language="C#" Debug="true" Service="WcfRESTful.PersonRetriever" CodeBehind="~/App_Code/PersonRetriever.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>

4.3添加Endpoint到Web.config

    <system.serviceModel>        <services>            <service name="WcfRESTful.PersonRetriever" behaviorConfiguration="ServiceBehavior">                <endpoint binding="webHttpBinding" contract="WcfRESTful.IPersonRetriever"/>                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>            </service>        </services>        <behaviors>            <serviceBehaviors>                <behavior name="ServiceBehavior">                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->                    <serviceMetadata httpGetEnabled="true"/>                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->                    <serviceDebug includeExceptionDetailInFaults="true"/>                </behavior>            </serviceBehaviors>        </behaviors>    </system.serviceModel>

4.4添加工程目录到IIS虚拟路径,命名为WCFTest。

以上4.1-4.4的所有步骤都完成了,我们通过URL:http://16X.19X.18X.6X/wcftest/Service.svc/Persons/Tom 一样可以得到上面的结果{"Age":22,"Birthday":"\/Date(1329226087212-0500)\/","Name":"Tom"}。

这里需要补充一点,在4.1步骤,我们新建一个Web Service工程,仅仅是为了少写一些Web.Config的配置(会默认有system.web,complier等配置信息),其实我们完全可以新建App_Code文件夹,把Contact和Contract实现拷入该文件夹,然后在外层手工新建Service.svc,Web.config并写入相应配内容,一样可以成功部署和使用。

5. 总结
RESTful Web Service用更简单通用的协议(HTTP,少了SOAP这一道封装和解析),更直接的结果,让人眼前一亮,在资源不需要交互逻辑和复杂结构的情况下还是不错的选择。

http://www.cnblogs.com/KeithWang/archive/2012/02/14/2351826.html

WCF实现RESTFul Web Service相关推荐

  1. WCF实现RESTFul Web Service(三):RESTful WebService VS SOAP WebService

    SOAP SOAP最早是针对RPC的一种解决方案,简单对象访问协议,很轻量,同时作为应用协议可以基于多种传输协议来传递消息(Http,SMTP等).但是随着SOAP作为WebService的广泛应用, ...

  2. Java RESTful Web Service实战

    编者按: InfoQ开设栏目"品味书香",精选技术书籍的精彩章节,以及分享看完书留下的思考和收获,欢迎大家关注.本文节选自韩陆著<Java RESTful Web Servi ...

  3. 【转】Spring 4.x实现Restful web service

    http://my.oschina.net/yuyidi/blog/352909 首先我们还是跟之前一样,创建一个maven项目,不过因为Spring Restful web service是基于Sp ...

  4. 使用JAX-RS创建RESTful Web Service

    guice resteasy http://www.cnblogs.com/ydxblog/p/7891224.html http://blog.csdn.net/withiter/article/d ...

  5. JAX-RS 方式的 RESTful Web Service 开发

    2019独角兽企业重金招聘Python工程师标准>>> Web Service 目前在风格上有两大类,一个是基于 SOAP 协议,一个是完全遵循 HTTP 协议规范的RESTful  ...

  6. spring3创建RESTFul Web Service

    spring 3支持创建RESTFul Web Service,使用起来非常简单.不外乎一个@ResponseBody的问题. 例如:后台controller: 做一个JSP页面,使用ajax获取数据 ...

  7. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service...

    起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)--不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...

  8. 关于Restful Web Service的一些理解

    对于restful web service,刚开始确实是个不太好理解的概念. 看了些文章,总是在描述和解释restful的原则: 1)显式地使用HTTP方法. 2)无状态. 3)公开目录结构式的 UR ...

  9. java 创建restful_使用Java创建RESTful Web Service

    [RESTful Web Service是轻量级的service,可以通过HTTP的方式来实现对后台数据库的CRUD,在Web开发和移动开发时使用的比较广泛,非常方便.在Java世界里, JAX-RS ...

最新文章

  1. python线程执行带有参数的任务(args、kwargs)
  2. 如何连接mongodb数据库,并且从中查找数据
  3. 10年卖下28家AI公司 苹果的AI吸星大法!
  4. vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...
  5. 一个虐你千百遍的问题:“RPC好,还是RESTful好?”
  6. C#开发笔记之13-如何用C#分隔字符串并返回字符串数组?
  7. 【Unity与23种设计模式】访问者模式(Visitor)
  8. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
  9. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优
  10. gateway nacos注册服务_使用Nacos作为微服务注册中心和配置中心
  11. 如何在Node.js上的Express.js中获取GET(查询字符串)变量?
  12. SQL拼接自己需要的字符串
  13. vbox NAT 设置端口映射(NAT+8080端口转发)
  14. 320240带中文字库液晶显示屏
  15. 物联网之有线通信技术之短距离的现场总线
  16. Python+Kivy(App开发)从入门到实践
  17. 搞事课堂 C++格式化硬盘
  18. 既然android service是运行在主线程中的,那service还有什么用?
  19. 普通人利用寒假一个月可以学会的四个赚钱技能
  20. 2、Linux命令合集

热门文章

  1. matlab画多个垂直的线段,新手求助,图形最后多出一条垂直线
  2. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
  3. c语言simpson积分计算方法,数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序...
  4. python html解析查找字符串_用python的BeautifulSoup分析html
  5. 2 OC 对象的本质(一个Student 占用的内存大小)
  6. SpringBoot b2b2c 多用户商城系统(十五)Springboot整合RabbitMQ...
  7. [转]web打印实现方案 Lodop6.034 使用方法总结
  8. MySQL RR隔离级别的更新冲突策略
  9. 那些进入 Alexa 排名前 250 的 WordPress 网站
  10. oracle--with as