Wcf体现Restful风格
概述
含状态传输(Representational State Transfer)的软件架构风格。主要特点
1、 资源是由URI来指定: 例如http://example.com/resources/
2、 对资源的操作 包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法
3、 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等。
下面通过一个简单的例子逐个问题解决。
问题简述
图书管理,功能可以查看全部数目,也可以查看一本书的详情,同样也可以通过浏览器对书目资源进行添加、修改、删除。
代码简介
接口定义
接口契约定义,将数目看做一种资源,通过设置UriTemplate属性,我们可以通过uri访问书目资源。(主要WebGet对应于http中的get请求方法,WebInvoke对应于PUT、POST、DELETE)这里有对应的我个操作,查看所有数目,查看具体那本书,对书进行添加、更新、删除。
<span style="font-size:18px;"> [ServiceContract] public interface IBookService { [OperationContract] [WebGet(UriTemplate="all",ResponseFormat=WebMessageFormat.Json)] List<Book>GetBooksList(); [OperationContract] [WebGet(UriTemplate = "Book/{id}")]//WebGet对应于get请求 BookGetBookById(string id); [OperationContract] [WebInvoke(UriTemplate = "AddBook",Method = "PUT")] void AddBook(Bookbook); [OperationContract] [WebInvoke(UriTemplate="UpdateBook",Method="POST")] void UpdateBook(Bookbook); [OperationContract] [WebInvoke(UriTemplate="DeleteBook/{id}",Method="DELETE")] void DeleteBook(stringid); } [DataContract] public class Book { [DataMember] public int ID { get; set; } [DataMember] public stringBookName { get; set;} [DataMember] public stringBookPrice { get; set;} }</span>
实现接口
这里为了简单将书目存在一个静态的泛型集合中。
<span style="font-size:18px;"> public class BookService : IBookService { public static List<Book>_listBooks = null; public List<Book> GetBooksList() { if (_listBooks == null) { _listBooks = new List<Book>(){ new Book{ID=1,BookName="The west story",BookPrice="$29.0"}, new Book{ID=2,BookName="Jack",BookPrice="$40.8"}}; } return _listBooks; } public BookGetBookById(string id) { try { int bookId = Convert.ToInt32(id); Book book =_listBooks.FirstOrDefault(e => e.ID == bookId); if (null== book) { WebOperationContext.Current.OutgoingResponse.StatusCode= HttpStatusCode.NotFound; } return book; } catch { throw newFaultException("Somethingwent wrong"); } } ///<summary> ///添加 ///</summary> ///<param name="book"></param> public void AddBook(Book book) { _listBooks.Add(book); } ///<summary> ///删除 ///</summary> ///<param name="id"></param> public voidDeleteBook(string id) { Book book = GetBookById(id); _listBooks.Remove(book); } public voidUpdateBook(Book book) { this.DeleteBook(book.ID.ToString()); this.AddBook(book); } } }</span>
配置文件
<span style="font-size:18px;"><system.serviceModel> <behaviors> <endpointBehaviors> <behaviorname="restfulBehavior"> <webHttphelpEnabled="true" /> </behavior> </endpointBehaviors> <serviceBehaviors> <behaviorname=""> <serviceMetadatahttpGetEnabled="true" /> <serviceDebugincludeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <servicename="WcfRestSample.BookService"> <endpointaddress=""behaviorConfiguration="restfulBehavior" binding="webHttpBinding"bindingConfiguration=""contract="WcfRestSample.IBookService" /> </service> </services> <serviceHostingEnvironmentmultipleSiteBindingsEnabled="true" /> </system.serviceModel></span>
测试
访问所有数目http://localhost:53215/IBookService.svc/all
访问具体书目http://localhost:53215/IBookService.svc/Book/1
对书目管理这里笔者用fiddler的composer对服务器PUT POST GET请求
添加书
PUThttp://localhost:53215/IBookService.svc/UpdateBook HTTP/1.1
Content-Type: application/xml;charset=utf-8
Host:localhost:53215
Conent-Length:187
Expect:100-continue
Accept-Encoding:gzip,deflate
<Bookxmlns="http://schemas.datacontract.org/2004/07/WcfRestSample"xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookName>SharePoint2010</BookName><BookPrice>$29.0</BookPrice><ID>3</ID></Book>
更新(这里是先删除在更新)
POSThttp://localhost:53215/IBookService.svc/UpdateBook HTTP/1.1
Content-Type: application/xml;charset=utf-8
Host:localhost:53215
Conent-Length:187
Expect:100-continue
Accept-Encoding:gzip,deflate
<Bookxmlns="http://schemas.datacontract.org/2004/07/WcfRestSample"xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><BookName>SharePoint2010开发最佳实践</BookName><BookPrice>$29.0</BookPrice><ID>3</ID></Book>
总结
这里只是对restful风格在wcf中简单介绍,有不足的地方还希望大家提出,多多交流,热爱编程。