Wcf体现Restful风格

来源:互联网 发布:windows无法格式化c盘 编辑:程序博客网 时间:2024/05/07 20:05

Wcf体现Restful风格

概述

含状态传输(Representational State Transfer)的软件架构风格。主要特点

1、  资源是由URI来指定: 例如http://example.com/resources/

2、  对资源的操作 包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法

3、  传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSONXML 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中简单介绍,有不足的地方还希望大家提出,多多交流,热爱编程。

 

0 0
原创粉丝点击