首页 > 代码库 > Wcf体现Restful风格

Wcf体现Restful风格

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中简单介绍,有不足的地方还希望大家提出,多多交流,热爱编程。

 

Wcf体现Restful风格