![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802dou2.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
什么是REST?
最早
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802yi.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
![](/icons/84802dou.gif)
http://www.anytao.com/book/insidenet/ch1
方式来读取[你必须知道
![](/icons/84802de.gif)
![](/icons/84802yi.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
http://www.anytao.com/book/insidenet/ch1/create
或者
http://www.anytao.com/book/insidenet/ch1/delate
来增加或者删除相应
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
你看
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
- 通过URI标识唯
资源
并通过HTTP谓词(GET, POST, PUT, DELETE)进行资源操作
资源是自描述
意味着资源
信息包含在资源请求本身
我们将在后面
举例中感受
所有操作都是无状态
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
- 简单易懂
URI本身就公开了所有操作
意义
那么对于WEB消费而言
其简单性来得直截了当
因此我喜欢
统
接口设计
统
接口设计是基于统
资源操作
必然结果
实现了服务层次
低耦合
保证了系统
简化
扩展性资源是自描述
那么其本身包含了所有
必要信息
对于扩展而言这是最方便
机制
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
- REST _disibledevent=>A Brief Introduction to REST
REST in Plain English
RESTful .NET Fundamentals (training)
RESTful Web Services (book)
RESTful .NET (book)
RESTy DayTrader
WCF REST Starter Kit
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
创建基于WCF
![](/icons/84802de.gif)
必要
![](/icons/84802de.gif)
为了实现
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![[玩转Silverlight]第 3回:基础篇<img src='/icons/84802dou.gif' />在Silverlight中使用基于WCF<img src='/icons/84802de.gif' />REST服务(上)](http://www.crazycoder.cn/WebFiles/20092/a1642d5e-e58b-4aa8-9970-0b9f6dd56cfc.jpeg)
其中包括以下几个实体:
- User
用户 Post
用户发布
文章
Comments文章
评论
![](/icons/84802de.gif)
- GetAllUsers
获取所有
用户信息 GetPostsByName
按照用户名称获取其发布
所有文章信息
GetPostByID按照文章ID获取该篇文章信息
GetCommentByAuthor按照评论者姓名获取其评论信息
AddComment添加按照文章添加评论
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
WCF
![](/icons/84802de.gif)
.NET 3.5中实现了WCF
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
- WebGetAttribute和WebInvokeAttribute
其中WebGet标识调度
响应HTTP GET请求
而WebInvoke则标示调度
响应任何HTTP请求
其中以WebInokeAttribute.Method属性来标识
默认情况下映射为HTTP POST
以WebGet为例
[AttributeUsage(AttributeTargets.Method)]
public sealed
WebGetAttribute : Attribute, IOperationBehavior, IWmiInstanceProvider
{
public WebGetAttribute
;
public WebMessageBodyStyle BodyStyle { get;
; }
public bool IsBodyStyleSetExplicitly { get; }
public bool IsRequestFormatSetExplicitly { get; }
public bool IsResponseFormatSetExplicitly { get; }
public WebMessageFormat RequestFormat { get;
; }
public WebMessageFormat ResponseFormat { get;
; }
public
UriTemplate { get;
; }
}
其中UriTemplate是WCF为每种资源以模板
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
[WebInvoke(UriTemplate = "/{name}/{post}", Method = "POST")]
Comment AddComment(
name,
post, Comment comment);
RequestFormat和ResponseFormat是WebMessageFormat类型
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
public enum WebMessageFormat
{
Xml = 0,
Json = 1,
}
那么
![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
// Release : 2009/02/12
// Author : Anytao, http://www.anytao.com
[ServiceContract(Namespace="http://api.anytao.com/rest/")]
public
erface IPostService
{
[OperationContract]
[WebGet(UriTemplate = "/", ResponseFormat = WebMessageFormat.Xml)]
List<User> GetAllUsers
;
[OperationContract]
[WebGet(UriTemplate = "/{name}", ResponseFormat = WebMessageFormat.Xml)]
List<Post> GetPostsByName(
name);
[OperationContract]
[WebGet(UriTemplate = "/{name}/{post}", ResponseFormat = WebMessageFormat.Json)]
Post GetPostByID(
name,
post);
[OperationContract]
[WebGet(UriTemplate = "/{name}/{post}/{comment}", ResponseFormat = WebMessageFormat.Json)]
Comment GetCommentByAuthor(
name,
post,
comment);
[OperationContract]
[WebInvoke(UriTemplate = "/{name}/{post}", Method = "POST")]
Comment AddComment(
name,
post, Comment comment);
}
- WebHttpBinding和WebHttpBehavior
就像BasicHttpBinding和BasicHttpBehavior
样
用于确定WCF
通信方式
WebHttpBinding用于为通过HTTP请求公开
WCF服务配置终结点
WebHttpBehavior则完成对于“URI+谓词”
启动
为WebHttpBinding支持Web样式服务提供支持
像
般
WCF服务
样
WebHttpBinding可以通过编码方式和配置方式两种途径完成
当然我们更推荐
是配置方式:
<bindings>
<webHttpBinding>
<binding name="secure">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpo
Behaviors>
<behavior name="postbehavior">
<webHttp/>
</behavior>
</endpo
Behaviors>
</behaviors>
- WebServiceHost和WebServiceHostingFactory
顾名思义WebServiceHost承载利用配置终结点
绑定
而WebServiceHostingFactory利用工厂模式进行WebServiceHost
创建工作
在Self Host时
我们可以利用WebServiceHost简化对WebHttpBinding和WebHttpBehavior
配置过程
例如:
// Release : 2009/02/19
// Author : Anytao, http://www.anytao.com
void Main(![](/icons/84802string.gif)
args)
{
baseUri = "http://localhost:6666/PostService";
WebServiceHost sh =
WebServiceHost(typeof(PostService),
Uri(baseUri));
sh.Opened
(s1,s2) =>
{
Console.WriteLine("Service begin to listen via {0}", baseUri);
};
sh.Open
;
Console.ReadLine
;
}
我们将在下面
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
Note:下面是WCF REST
![](/icons/84802de.gif)
实现WCF
![](/icons/84802de.gif)
实现WCF
![](/icons/84802de.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
// Release : 2009/02/19
// Author : Anytao, http://www.anytao.com
public
PostService : IPostService
{
private List<User> users;
public List<Post> GetPostsByName(
name)
{
User user = (from u in users
where u.Name
name
select u).Single
;
user.Posts;
}
}
下篇预告
在下篇
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
![](/icons/84802yi.gif)
![](/icons/84802de.gif)
![](/icons/84802dou.gif)
- 两种方式Host WCF RESTful服务
在Silverlight中消费WCF RESTful服务
本文版权归作者所有
![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
![](/icons/84802dou2.gif)
系列文章:
[玩转Silverlight]第
![](/icons/84802yi.gif)
![](/icons/84802dou.gif)
[玩转Silverlight]第 2回:应用篇
![](/icons/84802dou.gif)
[玩转Silverlight]第 3回:基础篇
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
[玩转Silverlight]第 4回:基础篇
![](/icons/84802dou.gif)
![](/icons/84802de.gif)
Silverlight 2中多语言支持实现(上)
Silverlight 2中多语言支持实现(下)
最新评论