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