ASP.NET Web API——选择Web API还是WCF
WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考虑SOAP和WS-*。
WCF已经出现好多年了,相对来说ASP.NET Web API还是个小孩子,但是不意味着ASP.NET Web API要代替WCF,在不同的场合,它们各有长处。ASP.NET Web API非常轻量,在功能和灵活性上都不能和WCF相比。如果你的服务是基于TCP的,或者支持更多的传输机制,那么WCF是最好的选择。然而,不是所有的 平台都支持SOAP和WS-*,当客户端不支持这些协议的时候,ASP.NET Web API就更胜一筹了。
一,让我们通过一个例子看一下两种编程模型的不同:一个根据雇员ID获取公司雇员的服务。WCF代码如1-1,ASP.NET Web API代码如1-2
1-1 WCF方式获取雇员信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[ServiceContract] public interface IEmployeeService { [OperationContract] [WebGet(UriTemplate = "/Employees/{id}" )] Employee GetEmployee( string id); } public class EmployeeService : IEmployeeService { public Employee GetEmployee( string id) { return new Employee() { Id = id, Name = "John Q Human" }; } } [DataContract] public class Employee { [DataMember] public int Id { get ; set ; } [DataMember] public string Name { get ; set ; } // other members } |
1-2 ASP.NET Web API方式获取雇员信息
1
2
3
4
5
6
7
|
public class EmployeeController : ApiController { public Employee Get( string id) { return new Employee() { Id = id, Name = "John Q Human" }; } } |
这里值得注意的是:ASP.NET Web API和MVC非常像,除了它继承自ApiController。MVC的一些特性如:绑定和可测试性等对ASP.NET Web API都是可用的。
二、WCF相关更新
微软已经有了一个的Web服务框架叫做Windows Communication Foundation( WCF),它利用TCP、HTTP、MSMQ等传输协议构建“契约先行”的服务。WCF最初为基于SOAP的服务而设计,首先支持的是WS-*功能,但后 来添加了少量迎合REST的功能。在WCF 4.5也有很大的增强,具体可以看如下系列文章:
- What’s new in WCF 4.5? Let’s start with WCF configuration
- What’s new in WCF 4.5? A single WSDL file
- What’s new in WCF 4.5? Configuration tooltips and intellisense in config files
- What’s new in WCF 4.5? Configuration validations
- What’s new in WCF 4.5? Multiple authentication support on a single endpoint in IIS
- What’s new in WCF 4.5? Automatic HTTPS endpoint for IIS
- What’s new in WCF 4.5? BasicHttpsBinding
- What’s new in WCF 4.5? Changed default for ASP.NET compatibility mode
- What’s new in WCF 4.5? Improved streaming in IIS hosting
- What’s new in WCF 4.5? UDP transport support
- What’s new in WCF 4.5? WebSocket support (Part 1 of 2)
- What’s new in WCF 4.5? WebSocket support (Part 2 of 2)
随着时间流逝,WCF Web API为了让WCF适配到”原生”HTTP世界,遇到了很多困难。因为WCF主要是为基于SOAP的XML消息设计的,为了让Web API成为WCF一部分,需要动的手术实在有点大(至少Web API的开发者们给了我这样的印象),是基于RPC风格的API。另一方面,ASP.NET MVC的基础设施既能优雅地处理HTTP请求和响应,又能轻松创建各种控制器,好像是创建这种新类型服务的合适途径。
- 支持URL路由,透过用户熟悉的MVC风格路由语义,生成干净的URL
- 根据Accept标头对请求和响应的序列化形式进行内容协商(Content Negotiation)
- 支持大量输出格式,包括JSON、XML、ATOM等
- 默认对REST语义有完善支持,同时又不强制限定必须使用REST语义
- 易于扩展的Formatter机制,支持添加新的输入/输出类型
- 可通过HttpResponseMessage类、HttpRequestMessage类和强类型枚举来描述大量的HTTP操作,提供对更高级的HTTP特性的深度支持
- 基于惯例的设计引导用户按HTTP Services的正确方式行事
- Formatters和Filters延续了MVC的扩展模型,具备出色的扩展能力
- 用于非Web程序时,可以脱离IIS运行(Self-hostable)
- 具备可测试性,测试机制的设计类似于MVC
Web api
主要功能:
支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作
请求的回复格式支持 JSON,XML,并且可以扩展添加其他格式。
.请求的回复通过Http Status Code表达不同含义,并且客户端可以通过Accept header来与服务器协商格式,例如你希望服务器返回JSON格式还是XML格式
应用场景:
- 富客户端web应用程序:ASP.NET Web API适合大量使用AJAX调用的富客户端应用程序,如Silverlight应用程序,基于Adobe Flash的应用程序或单页应用程序(SPA)等。
- 本地移动和非移动程序:移动设备不支持SOAP,然而ASP.NET Web API可以作为运行在移动设备上的本地程序的后端。
- 物联网平台(IOT):使用以太网控制器或GSM猫的IOT设备可以通过HTTP和ASP.NET Web API服务会话。不仅仅是IOT设备,其他支持HTTP的设备,例如RFID读写器都可以和ASP.NET Web API通信。
- 如果服务需要在http协议上,并且希望利用http协议的各种功能,
- 如果服务需要被各种客户端(特别是移动客户端)调用,选择Web API
WCF
主要功能:
分布式通信框架的集大成者
应用场景:
1.SOAP Services:这是因为WCF服务是基于消息的通讯机制,而它的消息是被封装为一个SOAP Envelope(SOAP 信封的)
2.WebHttp Services:是在传统的SOAP Services基础上的一个增强,它仍然是基于操作(Operation)的,只不过这些Operation可以直接通过Uri访问到,而无需客户去编写一个特殊的客户端。(ps: 实质是webservice,用的最多的)
同时,WebHttp Services提供了两种不同的消息格式,第一种是XML,第二种是Json。这将更加有利于诸如Javascript这种客户端来访问服务。
要实现WebHttp,我们首先要添加一个引用
3.WCF Data Service:支持两种数据模型,一种是LINQ to SQL, 一种是ADO.NET Entity Frmawork。
4. Workflow Services:这是一个很有意思的服务。这是在.NET Framework 4.0中开始出现的,也就是随着Workflow Foundation升级到4.0之后,提供了一种全新的服务类型,简单地来说,它是可以直接与Workflow Foundation(工作流)想结合的一种服务。
5.RIA Services:RIA的意思是,Rich Internet Application。在微软平台上,Silverlight就是RIA战略中的核心产品,所以很显然,RIA Service主要就是为Silverlight服务的。这个是.NET Framework 4.0中才有的功能,并且还需要安装RIA Service Toolkit。
总结:
现在我们拥有了2个服务框架,一个基于RPC(远程过程调用(Remote Procedure Call) )机制的WCF和一个基于HTTP的ASP.NET Web Api。
在我们的开发实践中如何进行选择呢? 可以参照知名互联网企业,无论是google,facebook,baidu,新浪还是腾讯。他们对外开放的接口都是基于Http的Web API,在服务内部框架都是基于SOA架构设计的,通讯机制都是采用RPC机制的,例如Google Protocol Buffers ,Facebook thift。 我们完全也可以这样搭配,在内部通讯采用WCF + Protobuf-NET,参看《WCF服务上应用protobuf》,对外的服务采用ASP.NET WEB API。WCF的 TCP、Named Pipes,甚至UDP(在WCF 4.5中)绑定的性能要比HTTP强很多倍,这里有一个几年前的微软的测试报告《WCF 性能基准报告》,对外提供的服务采用Web API同时也是一个业界标准问题,用WebAPI就很容易的跨越ios,android,wp等移动终端平台,同时有很成熟的OAuth 解决安全问题。
ASP.NET Web API——选择Web API还是WCF的更多相关文章
- DOM扩展-Selectors API(选择符 API)、元素遍历
DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...
- 选择Web API还是WCF
ASP.NET WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WC ...
- 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2
----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...
- 从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
- 从头编写 asp.net core 2.0 web api 基础框架 (3)
第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
第1部分:http://www.cnblogs.com/cgzl/p/7637250.html 第2部分:http://www.cnblogs.com/cgzl/p/7640077.html 第3部分 ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
随机推荐
- Eclipse的DDMS File Explorer无法进入data目录解决方案
进入data目录需要root权限.所以,你的手机要有root才可以.然后做以下步骤就可以了 1.cmd进入platform-tools目录 2.adb shell 3.su(这里要看手机有没有请求ro ...
- iOS中几种定时器 - 控制了时间,就控制了一切
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...
- 封装的多功能多效果的RecyclerView
开源界有一句很有名的话叫"不要重复发明轮子",当然,我今天的观点不是要反驳这句话,轮子理论给我们的开发带来了极大的便利,.但我想说的是,既要会用轮子,也要知道轮子怎么造,必要的时候 ...
- JavaScript Source Map 详解
源码地址: http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html 上周,jQuery 1.9发布. 这是2.0版之前的最后 ...
- Mac下移动硬盘不能粘贴
不想格式化,安装 Paragon NTFS 10.0.2 from:http://www.nowmac.com/support/mac/664.html 就可以解决
- ios开发——实用技术OC-Swift篇&本地通知与远程通知详解
本地通知与远程通知详解 一:本地通知 Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...
- JavaScript笔记 第十六章 匿名函数和闭包
1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...
- C# 之 用NPOI类库操作Excel
1.需引用以下命名空间: using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HPSF; using NPOI.HSSF.Ut ...
- python--判断数据类型可不可变
内存是一块空间,可以比喻成一个比较大的房子,定义一个变量就是在大房子中建立一个小房子,判断一个数据类型可不可变,就是看在这个这个大房子中有没有新建小房子,可以通过id来判断,如果id没有变化则是不可变 ...
- 马上学Android开发在线视频教程全集
马上学Android开发视频教程全集 马上学Android开发[马上学Android]安卓开发视频教程 001 Androi 马上学Android开发[马上学Android]安卓开发视频教程 002 ...