WCF Web API 轻松实现 REST

本文对比了使用WCF实现REST与WCFWebAPI实现REST的复杂性和便捷性,展示了WCFWebAPI如何简化REST服务的开发过程,通过减少步骤和代码量,提高开发效率。

先体验一下,如果没有 WCF Web API,直接用 WCF 实现 REST 有多麻烦:

1. 创建 WCF 服务(ServiceContract)。

2. 创建 .svc 文件指向该 WCF 服务。

3. 在 web.config 中添加 <service>/<endpoint> 配置,并将 binding 设置为 webHttpBinding,示例配置如下:

复制代码
<services>
    <service name="CNBlogs.OpenAPI.Service.NewsRestService">
    <endpoint binding="webHttpBinding" 
                contract="CNBlogs.OpenAPI.Service.INewsRestService" 
                behaviorConfiguration="RESTFul"/>
    </service>
</services>
复制代码

4. 在 web.config 中添加 <endpointBehaviors>/<behavior> 配置,并在其中添加<webHttp />,在第3步的配置中添加该behaviorConfiguration(比如上面代码中的behaviorConfiguration="RESTFul"),示例配置如下:

<endpointBehaviors>
    <behavior name="RESTFul">
        <webHttp />
    </behavior>
</endpointBehaviors>

5. 在 OperationContract 方法上增加 WebInvoke 属性,示例代码如下:

复制代码
[OperationContract]
[WebInvoke(Method = "GET",
    UriTemplate = "News/Recent/{itemcount}",
    ResponseFormat = WebMessageFormat.Xml)
]        
IQueryable<NewsItem> GetRecentNews(int itemcount);
复制代码

上面的5步已经够麻烦了。开始以为到此就可以收工了,哪知不运行不知道,一运行吓一跳:

Operation 'GetRecentNews' in contract 'INewsRestService' has a path variable named 'itemcount' which does not have type 'string'.  
Variables for UriTemplate path segments must have type 'string'.

参数竟然不能用int类型,必须要用 string。只能望 WCF 心叹,不得不进入第6步。

6. 将 int 改为 string

IQueryable<NewsItem> GetRecentNews(string itemcount);

这是纯 WCF 实现 REST 的表演节目,节目名称叫“ WCF 实现 REST 六步走”,表演得分6分。

接下来,我们看看 WCF Web API 的表演

(如果不知道 WCF Web API 是何方神圣,请看演员介绍http://wcf.codeplex.com/wikipage?title=WCF%20HTTP

1. 在提供 REST 服务的方法上增加 [WebGet(UriTemplate = "")] 属性,示例代码如下:

复制代码
[ServiceContract]
public class NewsRestService
{
    [WebGet(UriTemplate = "{itemcount}")]
    public IQueryable<NewsItem> GetRecentNews(int itemcount)
    { 
        return newsList.AsQueryable();
    } 
}
复制代码

2. 在 Global.asax 的 Application_Start 中添加路由,示例代码如下:

复制代码
protected void Application_Start(object sender, EventArgs e)
{
    var config = new HttpConfiguration() ;
    RouteTable.Routes.Add(new ServiceRoute("news/recent",
        new HttpServiceHostFactory { Configuration = config },
        typeof(NewsRestService)));
}
复制代码

注:需要通过 NuGet 添加对 WebApi.All 的引用。news/recent 就是 REST 访问网址。

(注2:如果出现“ASP.NET routing integration feature requires ASP.NET compatibility.”错误,请在web.config中加上<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>)

收工!只需两步就实现 REST,WCF Web API 的表演得分2分。

2 : 6,WCF Web API 大获全胜!(分数少的怎么反而获胜?这是代码世界,不是现实世界,程序员说了算,谁的代码少,谁就获胜)


小结

WCF Web API 是 “First-class programming model for HTTP in WCF”,而 HTTP 是 Web 世界的通行证,Web API 可以让我们更轻松地畅游于 Web 编程世界。

实现 REST 只是 WCF Web API 小试牛刀,我们还可以不用修改任何服务端代码,只改变客户端请求的方式,就可以返回不现类型的数据。

比如:

1)将 HTTP Header 中的 Accept 改为 “application/json”,返回的就是 JSON 数据。

2)通过 Url 参数发起 OData 查询(比如“?$top=4&$orderby=Title” ),服务器收到请求后,会对返回结果进行 LINQ 查询(因此示例代码中的返回值类型是IQueryable<NewsItem>)。

估计大家经常会碰到诸如:http://www.deepleo.com/12这样的链接,没有.php,.aspx,.jsp这样的后缀,这个是大势所趋。 其实这就是RESTREST翻译成中文就是:“表述性状态转移”:Representational State Transfer,是网络服务接口的一种风格,并不是一个标准。 REST常用的四种HTTP命令,GET、DELETE、PUT和POST。 GET:是获取资源,DELETE: 是删除资源,PUT:修改资源,POST:不用说就是添加资源。 就web service而言,REST要比SOAP(SOAP是标准,不是风格)轻量得多,容易得多。最初开始接触web service的时候,所有的材料上来就是一大堆的名词,SOAP, WSDL,看得头都要大了,后来提出来的REST就容易理解得多,虽然目前SOAP在企业级的web service中还有一席之地,但是在公共的Internet上,不是REST的服务实在不好意思和人打招呼,我们经常可以看到评价某某服务是RESTful的,但是从来没有听说某某服务是SOAPful的。 REST提出了一些设计概念和准则: 1.网络上的所有事物都被抽象为资源(resource); 2.每个资源对应一个唯一的资源标识(resource identifier); 3.通过通用的连接器接口(generic connector interface)对资源进行操作; 4.对资源的各种操作不会改变资源标识; 5.所有的操作都是无状态的(stateless)。 微软对REST的支持有点晚,自.NET3.5开始,WCF也可以提供RESTful接口。当然,REST不光限于web service,网页服务也可以RESTful,微软的ASP.NET MVC框架提供了直接的REST支持。 有关.net,MVC实现REST风格的方法请参见张善友老师的博客:http://www.cnblogs.com/shanyou/category/307401.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值