[转]构建基于WCF Restful Service的服务
2017-05-25 16:07
239 查看
本文转自:http://www.cnblogs.com/scy251147/p/3566638.html
前言
传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织。并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便),所以给开发和部署带来了不小的麻烦。并且当服务过多的时候,生成的引用文件会很大,之前项目的一个引用文件光引用代码都有5000多行,全部在一个类中。确实不方便维护。
基于以上几点,就特别研究了一下基于Restful的服务开发,当时手头有两种框架,一个是WCF Restful Service,另一个是Asp.net Web API。由于对WCF比较熟悉一些,所以就选择了前者。
Restful Service及其相关
说到Restful Service,不得不提到其中的Rest这个关键字。它是用于创建分布式超文本媒体的一种架构方式,我们可以通过标准的HTTP(GET,POST,PUT,DELETE)操作来构建基于面向资源的软件架构方式(Resource-Oriented Architecture (ROA))。它是独立于任何技术或者平台的,所以人们经常将符合这种操作规范的服务称为“RESTful services”。因为WCF能够构建符合这种规范的服务,所以我们经常称之为 WCF Restful Services。
由于传统的WCF Service可以使用tcp,net.msmq,http等协议进行数据交换,并且采用了RPC(Remote Procedure Call)的工作方式,客户端需要添加对服务端的引用才能完成。但是WCF Restful Service完全使用Http协议来进行,并且无需添加客户端引用,所以方便很多。
服务端开发一瞥
下面以图书馆的例子来做具体的说明。
打开VS2010,新建一个WCF REST Service Application项目,然后在项目中,添加一个BookService.cs用于处理逻辑操作,再添加一个BookEntity.cs用于提供实体类。
打开Global.asax,可以看到如下代码:
[/code]
其中RegisterRoutes是设定服务启动的入口点的。
然后是BookEntity实体类的组织方式:
[/code]
这里我就不用多说了,实体类包含图书序号,图书名称,图书价格,出版单位四个属性。
然后就是我们的核心内容:
[/code]
其中,Method 方法主要是表明可以接受客户端的请求类型,这里有四种:GET,POST,PUT,DELETE,其中GET为请求数据,POST为更新数据,PUT为新增数据,DELETE代表着删除数据。
然后ResponseFormat 则代表着返回的数据组织,如果是Json则表明客户端会接收到Json数据,如果是XML则表明客户端会接收到XML组织的数据。BodyStyle 代表返回数据的包装对象,如果是Bare则表明数据无任何包装,原生数据返回;如果是Wrapped则表明数据会在最外层包装一个当前函数名称加上Result的套。比如对于Delete对象,则会返回 DeleteResult:{******},会造成DataContractJsonSerializer无法进行反序列化。
UriTemplate 主要用于指定操作的URI路径,只要用户输入了合法路径并采用了正确的请求方式,就会触发该函数。
最后说到的就是URI后面跟的参数的问题,由于函数只能接受string类型的,所以如果传入参数是string类型,则可以使用UriTemplate = "{bookID}"的路径,反之,则需要加上/?param1={paramname}的方式,比如我代码中使用的是:UriTemplate = "/?bookID={bookID}"。
当一切都弄好以后,让我们运行一下,访问如下路径,就可以得到结果:
http://localhost:45345/BookService/
得到的结果如下:
如果访问http://localhost:45345/BookService/?bookID=1,则会得到如下的结果:
客户端开发一瞥
初步测试成功后,让我们来进行一下全面的测试。
首先,在项目中,我们新建一个Asp.net WebForm Application,用于做测试工作。
然后,在Default.aspx.cs中,针对GET操作,我们添加如下代码:
[/code]
在以上代码中,DataContractJsonSerializer 是WCF提供的一个序列化类,用于将对象序列化或者反序列化。
写好之后,我们点击界面按钮,出现了以下的结果:
针对PUT操作,也就是添加操作,我们添加如下代码:
[/code]
在做这步的时候,需要注意,test.Headers.Add("Content-Type", "application/json") 和test.Headers.Add("ContentLength", byteSend.Length.ToString())需要添加,否则会造成Http 400 返回的错误。并且,向服务端传递实体的时候,可以通过使用UploadData的方式来进行,如果数据量过大,可以考虑使用异步方式传送。
接下来的POST和DELETE方法和上面类似,我都贴一下:
POST方法:
[/code]
DELETE方法:
[/code]
最后得到的效果图如下:
(新增记录)
(更新记录)
(删除记录)
成文仓促,难免有误,还请指出,在此谢过。
源代码下载
点击下载源代码
Edit:基于本方法构建的Android服务已经在使用中。后续继续跟进各种使用信息。
在StackOverFlow问答如下:点击这里查看
看评论中提到了IContract问题,由于这是Restful Service,不是基于RPC模式,所以没必要使用的。不过用上去也没错。
前言
传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织。并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便),所以给开发和部署带来了不小的麻烦。并且当服务过多的时候,生成的引用文件会很大,之前项目的一个引用文件光引用代码都有5000多行,全部在一个类中。确实不方便维护。
基于以上几点,就特别研究了一下基于Restful的服务开发,当时手头有两种框架,一个是WCF Restful Service,另一个是Asp.net Web API。由于对WCF比较熟悉一些,所以就选择了前者。
Restful Service及其相关
说到Restful Service,不得不提到其中的Rest这个关键字。它是用于创建分布式超文本媒体的一种架构方式,我们可以通过标准的HTTP(GET,POST,PUT,DELETE)操作来构建基于面向资源的软件架构方式(Resource-Oriented Architecture (ROA))。它是独立于任何技术或者平台的,所以人们经常将符合这种操作规范的服务称为“RESTful services”。因为WCF能够构建符合这种规范的服务,所以我们经常称之为 WCF Restful Services。
由于传统的WCF Service可以使用tcp,net.msmq,http等协议进行数据交换,并且采用了RPC(Remote Procedure Call)的工作方式,客户端需要添加对服务端的引用才能完成。但是WCF Restful Service完全使用Http协议来进行,并且无需添加客户端引用,所以方便很多。
服务端开发一瞥
下面以图书馆的例子来做具体的说明。
打开VS2010,新建一个WCF REST Service Application项目,然后在项目中,添加一个BookService.cs用于处理逻辑操作,再添加一个BookEntity.cs用于提供实体类。
打开Global.asax,可以看到如下代码:
[code]
[/code]
其中RegisterRoutes是设定服务启动的入口点的。
然后是BookEntity实体类的组织方式:
[code]
[/code]
这里我就不用多说了,实体类包含图书序号,图书名称,图书价格,出版单位四个属性。
然后就是我们的核心内容:
[code]
[/code]
其中,Method 方法主要是表明可以接受客户端的请求类型,这里有四种:GET,POST,PUT,DELETE,其中GET为请求数据,POST为更新数据,PUT为新增数据,DELETE代表着删除数据。
然后ResponseFormat 则代表着返回的数据组织,如果是Json则表明客户端会接收到Json数据,如果是XML则表明客户端会接收到XML组织的数据。BodyStyle 代表返回数据的包装对象,如果是Bare则表明数据无任何包装,原生数据返回;如果是Wrapped则表明数据会在最外层包装一个当前函数名称加上Result的套。比如对于Delete对象,则会返回 DeleteResult:{******},会造成DataContractJsonSerializer无法进行反序列化。
UriTemplate 主要用于指定操作的URI路径,只要用户输入了合法路径并采用了正确的请求方式,就会触发该函数。
最后说到的就是URI后面跟的参数的问题,由于函数只能接受string类型的,所以如果传入参数是string类型,则可以使用UriTemplate = "{bookID}"的路径,反之,则需要加上/?param1={paramname}的方式,比如我代码中使用的是:UriTemplate = "/?bookID={bookID}"。
当一切都弄好以后,让我们运行一下,访问如下路径,就可以得到结果:
http://localhost:45345/BookService/
得到的结果如下:
[{"BookID":1,"BookName":"大话设计模式","BookPrice":45.2,"BookPublish":"中国邮电出版社"},{"BookID":2,"BookName":"测试用例","BookPrice":21,"BookPublish":"清华大学出版社"},{"BookID":3,"BookName":"Rework","BookPrice":15.4,"BookPublish":"Wrox pulishment"}]
如果访问http://localhost:45345/BookService/?bookID=1,则会得到如下的结果:
{"BookID":1,"BookName":"大话设计模式","BookPrice":45.2,"BookPublish":"中国邮电出版社"}
客户端开发一瞥
初步测试成功后,让我们来进行一下全面的测试。
首先,在项目中,我们新建一个Asp.net WebForm Application,用于做测试工作。
然后,在Default.aspx.cs中,针对GET操作,我们添加如下代码:
[code]
[/code]
在以上代码中,DataContractJsonSerializer 是WCF提供的一个序列化类,用于将对象序列化或者反序列化。
写好之后,我们点击界面按钮,出现了以下的结果:
针对PUT操作,也就是添加操作,我们添加如下代码:
[code]
[/code]
在做这步的时候,需要注意,test.Headers.Add("Content-Type", "application/json") 和test.Headers.Add("ContentLength", byteSend.Length.ToString())需要添加,否则会造成Http 400 返回的错误。并且,向服务端传递实体的时候,可以通过使用UploadData的方式来进行,如果数据量过大,可以考虑使用异步方式传送。
接下来的POST和DELETE方法和上面类似,我都贴一下:
POST方法:
[code]
[/code]
DELETE方法:
[code]
[/code]
最后得到的效果图如下:
(新增记录)
(更新记录)
(删除记录)
成文仓促,难免有误,还请指出,在此谢过。
源代码下载
点击下载源代码
Edit:基于本方法构建的Android服务已经在使用中。后续继续跟进各种使用信息。
在StackOverFlow问答如下:点击这里查看
看评论中提到了IContract问题,由于这是Restful Service,不是基于RPC模式,所以没必要使用的。不过用上去也没错。
相关文章推荐
- 构建基于WCF Restful Service的服务
- 构建基于WCF的RESTful服务
- 在Asp.net应用程序中构建基于WCF Web.Api的服务
- Windows Azure Cloud Service (18) 基于Input Endpoint通过Worker Role发布WCF服务
- 基于SOAP协议的WCF 服务和符合RESTful规范的WCF服务区别和特点
- ADO.NET 4 快速上手(11)——WCF Data Service提供基于REST的服务(完)
- 基于jersey和Apache Tomcat构建Restful Web服务(一)
- WCF4.0 -- RESTful WCF Services(创建基于SSL的服务)
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
- Wcf Restful Service服务搭建
- 关于”System.ServiceModel.Activation.WebServiceHostFactory“与"<webHttp/>"以及RestFul/启用了Ajax的WCF服务
- Geneva------构建基于声明的WCF 服务的更好方法(转)
- Java Web Service-CXF -基于Restful的Web服务
- 基于jersey和Apache Tomcat构建Restful Web服务(二)
- WCF4.0 -- RESTful WCF Services(创建基于SSL的服务)
- WCF4.0 -- RESTful WCF Services(创建基于SSL的服务)
- .Net中使用WCF构建简单的基于B/S和C/S的服务
- WCF Restful Service的服务
- 基于WCF和MSMQ构建发布/订阅消息总线(Pub/Sub Message Bus)