zzWCF实现RESTFul Web Service

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

http://blog.csdn.net/qq_26054303/article/details/48655985

http://www.cnblogs.com/LNCLSH/p/3781572.html

共同学习了前面一些概念,终于开始正题了哈。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这一道封装和解析),更直接的结果,让人眼前一亮,在资源不需要交互逻辑和复杂结构的情况下还是不错的选择

时间: 2024-10-27 09:51:50

zzWCF实现RESTFul Web Service的相关文章

在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】

前言 本人一直开发Android应用,目前Android就业形势恶劣,甚至会一路下滑,因此决定学习服务器开发.采用的语言是java,IDE是Intellij,在下载Intellij的同时看到官网很多优秀的guide文章,于是按照guide成功完成了一个RESTful的demo.官方文档非常简洁,给我带来了很大的帮助,于是翻译之,希望对其他不愿意看原文的人有所帮助.由于水平有限,读者发现错误请指正,谢谢. 原文地址: https://www.jetbrains.com/help/idea/2016

Spring 4.x实现Restful web service

首先我们还是跟之前一样,创建一个maven项目,不过因为Spring Restful web service是基于Spring 4.x版本的,所以我在这里就直接将Spring升级到了4.0.8,下面我贴出我的pom文件主要的依赖: <properties> <spring.version>4.0.8.RELEASE</spring.version> </properties> <dependencies> <dependency> &

如何封装RESTful Web Service

所谓Web Service是一个平台独立的,低耦合的,自包含的.可编程的Web应用程序,有了Web Service异构系统之间就可以通过XML或JSON来交换数据,这样就可以用于开发分布式的互操作的应用程序.Web Service使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件就可相互交换数据或集成,无论它们各自所使用的语言.平台或内部协议是什么,都可以相互交换数据.Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制. ??REST(REpre

使用Java创建RESTful Web Service(转)

REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Styles and the Design of Network-based Software Architectures”<体系结构与基于网络的软件架构设计>中提出了REST. REST是一种体系结构.而HTTP是一种包含了REST架构属性的协议. REST基础概念 在REST中所有东西都被看作资源.

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

http://my.oschina.net/yuyidi/blog/352909 首先我们还是跟之前一样,创建一个maven项目,不过因为Spring Restful web service是基于Spring 4.x版本的,所以我在这里就直接将Spring升级到了4.0.8,下面我贴出我的pom文件主要的依赖: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3

Building a RESTful Web Service(转)

Building a RESTful Web Service This guide walks you through the process of creating a "hello world" RESTful web service with Spring. What you’ll build You’ll build a service that will accept HTTP GET requests at: http://localhost:8080/greeting a

RESTful Web Service的一些新体会

REST - Representational State Transfer 其实这个representational是指Resource的representation Resource其实就是实体,ReST中所有的对象都被视为Resource.每一个Resource都有一个URI(Unique Resource Identifier),通过访问URI就可以获取对应的resource Representational指的是resource的呈现形式,可以是txt, json, html, xml

怎样封装RESTful Web Service

所谓Web Service是一个平台独立的,低耦合的.自包括的.可编程的Web应用程序.有了Web Service异构系统之间就能够通过XML或JSON来交换数据,这样就能够用于开发分布式的互操作的应用程序. Web Service使得执行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件就可相互交换数据或集成.不管它们各自所使用的语言.平台或内部协议是什么,都能够相互交换数据.Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制. ??REST(REpr

用Jersey为Android客户端开发Restful Web Service

平时在做Android客户端的时候经常要与服务器之间通信,客户端通过服务端提供的接口获取数据,然后再展示在客户端的界面上,作为Android开发者,我们平时更多的是关注客户端的开发,而对服务端开发的关注相对较少,但是如果我们要自己一个人设计并开发一套完整的系统,我们就必须同时具备客户端和服务端的开发知识,而且我认为同时掌握客户端和服务端的开发技术还是很有用处的,不仅有助于提升我们的架构知识和能力,而且还……你懂得!身边一些做WEB开发的朋友很多都说为客户端开发接口和单纯地做WEB项目并没有很大的