Asp.net web api 知多少

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 五、ASP.NET WEB API2。本书最大的特色是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。
因为我的技术水平和英文水平也是有限的,所以错误在所不免,但愿你们多多留言指正。web

Q1. 什么是REST?
Ans. REST是 Representational State Transfer(表述性状态传递)的简称。是一项用于分布式环境数据交换的协议。
REST是一种架构风格,它将每一个服务对待为资源并经过Http协议方法(GET、POST、PUT、DELETE)获取数据。
REST风格的架构包含客户端和服务端。
客户端初始化请求到服务器,服务器负责处理请求并返回响应。
这些请求和响应都是围绕这些资源的表示形式进行传递。面试


Q2. 解释下REST原则?
Ans. REST是一系列原则,用来定义web标准,好比HTTP、URIs 如何被使用。
主要有如下5条重要的REST原装:
AddressableResources(可访问的资源) - 每个资源都应该能被URI(惟一标识符)肯定。
Simple and Uniform Interfaces(有一致接口) - REST是基于HTTP协议的,使用HTTP GET, POST, PUT, DELETE
来执行操做。使得REST简单一致。
RepresentationOriented(面向表述) - 资源的表现形式能够交换的。GET用来获取资源的某种表现形式,POST用来传递资源到服务器以致于底层资源可以被改变。Representation能够有不少种表现形式,好比XML、Json等。
Communicate Stateless(无状态通讯) - 一个应用程序能够拥有状态可是没有客户端会话数据存储在服务器。任何会话类型的数据应该在客户端保存和处理,只有在每次请求中按需传递到服务器。
Cacheable(可缓存) - 客户端应该可以缓存响应以供后续使用。json


Q3. REST和 SOAP间的区别是什么?
Ans. 详见下表:api

SOAP REST
SOAP 是 Simple Object Access Protocol(简单对象访问协议)的简称 REST 是Representational State Transfer(表述性状态传递)的简称
它是一个基于 XML 的协议,创建在 HTTP 或 TCP/IP,SMTP基础之上。 REST不是一个协议而是一种架构风格。 好比:基于资源的架构。
SOAP 提供了无状态和有状态的两种实现方式。 REST 是无状态的。
SOAP 使用xml做为消息格式 REST 支持xml,json
SOAP 定义了标准的规范。好比:WS-Security是实现安全的规范 未定义标准规范
SOAP 消息包含了一个信封,里面包含了SOAP的Header、Body(用来存储你实际要发送的信息) REST 使用HTTP集成的header(支持多种媒体类型)去携带元数据,使用GET、POST、PUT、DELETE 动词执行CURD
SOAP 使用接口以及命名的操做去调用Service。 REST 使用 URI 以及(GET, PUT, POST, DELETE)方法来调用Service。
比REST慢 比SOAP快

Q4. 什么是ASP.NET WEB API?
Ans. ASP.NET WEB API 是一个框架用来搭建HTTP服务以供客户端(好比:浏览器,手机,IPhone等)调用。它与ASP.NET MVC很类似由于它包含mvc的功能,好比 routing, controllers, action results, filter, model binders, IOC container or dependency injection。
可是它并非MVC框架的一部分。它是
ASP.NET 平台的核心部分。能被MVC或者其余类型的web应用使用。同时它也能够用做独立的web服务应用程序。
ASP.NET WEB API 功能浏览器

  1. 它支持基于约定的CRUD操做由于它支持HTTP 动词 GET, POST, PUT , DELETE。
  2. 响应包含http状态码和Accept header。
  3. 响应被WEB API中的MediaTypeFormatter 格式化为JSON, XML或者任何你想添加做为 MediaTypeFormatter的任何格式。
  4. 它能够接收和生成非面向对象的内容好比图像!PDF等。
  5. 它已经自动支持 OData 。所以将 [Queryable]特性添加到controller的方法中,它将会返回 IQueryable结果, 客户端可使用该方法进行OData组合查询。
  6. 能够在IIS或应用程序中寄宿。
  7. 它支持 MVC 的许多功能,好比routing, controllers, action results, filter, model binders, IOC container or dependency injection 。

Q5. 为何要选择ASP.NET WEB API?
Ans. 现在,基于Web的应用程序已经远不能知足客户需求。在平常生活中人们使用iphone,手机,平板等。这些设备有一系列的app软件来提供便利的服务。所以咱们的关注点再也不仅仅是web还有app。缓存

WEB API

因此,若是你想以快速且简单的方式暴露你的服务端数据到浏览器端和现代设备app上,你应该有一个API,它负责兼容浏览器和全部设备。
好比:twitter,facebook,Google Api都支持web应用程序和手机app。
WEB API是一个很棒的框架用来暴露你的数据和服务到不一样的设备。并且WEB API是一个开源的平台基于.net framework来提供Rest-ful的服务。
不像WCF REST Service,它使用HTTP完整的功能(URIs,request/response headers,caching,versioning,various content formats),你不须要像wcf rest service那样为不一样的设备定义额外的配置文件安全

Why to choose WEB API?服务器

  1. 若是咱们须要web service但不须要 SOAP,那么ASP.NET WEB API将是最佳选择。
  2. 它在现有WCF消息管道之上,构建简单的,基于非SOAP的HTTP服务。
  3. 它不像WCF REST service那样须要配置乏味的配置文件。
  4. 使用WEB API建立服务十分简单。
  5. 基于HTTP而且容易定义,以REST方式公开和使用。
  6. 它是轻量级的架构,适用于有限带宽的设备,如智能手机。
  7. 开源。

Q6. WCF、WEB API、 WCF REST 、Web Service之间的区别是?
Ans. 主要区别是:
Web Service架构

  1. 基于SOAP协议,返回xml数据格式。
  2. 仅支持HTTP协议。
  3. 非开源,只要客户端能解析xml就可使用。
  4. 只能在IIS上挂载。

WCFmvc

  1. 基于SOAP协议,返回xml数据格式
  2. 它是web service(ASMX)的演化版。支持TCP, HTTP, HTTPS, Named Pipes, MSMQ。
  3. 须要额外配置大量繁琐的配置项。
  4. 非开源,只要客户端能解析xml就可使用。
  5. 能够在应用程序或IIS或window service上承载。

WCF Rest

  1. 将WCF 做为 WCF Rest 服务使用,您必须启用 webHttpBindings.
  2. 支持HTTP GET和POST,分别对应使用 [WebGet] 和 [WebInvoke] 特性。
  3. 若是须要支持其余HTTP动词,你须要在.svc文件中针对须要支持的HTTP动词作一些配置。
  4. 使用WebGet经过参数传递数据,须要配置。同时,UriTemplate 必须指定。
  5. 支持XML, JSON 和 ATOM 数据格式。

WEB API

  1. 一种新的框架提供了简易的方式用来搭建HTTP services。
  2. WEB API是一个开源的理想的平台在.NET Framework上搭建REST-ful services。
  3. 它使用HTTP的完整功能(像 URIs, request/response headers, caching,
    versioning, various content formats)。
  4. 它也同时支持MVC同样的功能(routing, controllers, action results, filter, model binders, IOC container or dependency injection, unit testing),使得它更简单强健。
  5. 能够在应用程序或IIS中承载。
  6. 它是轻量级的架构,支持多种设备特别是有带宽限制的设备好比智能手机。
  7. 响应被WEB API的MediaTypeFormatter格式化为 JSON、 XML或者任何你想要添加做为 MediaTypeFormatter 的任何格式。

Q7. 在WCF 和 WEB API之间如何选择?
Ans. 能够从如下几点进行考虑:

  1. 须要支持特别的场景,好比:one way messaging(单向通讯),message queues(消息队列),duplex communication(全双工通讯)等,选择WCF。
  2. 当您想建立一个可使用快速传输通道的服务时,请选择WCF,如TCP,命名管道,或者甚至UDP(在WCF 4.5),而且当全部其余通道不可用时可以支持HTTP传输信道。
  3. 当您要经过HTTP建立面向资源的服务时选择WEB API,由于其可使用完整的 HTTP的特性(如URI,请求/响应头,缓存,版本控制,各类内容格式)。
  4. 若是您但愿将服务公开给普遍的客户端(包括浏览器, 手机,iphone和平板电脑),选择WEB API。

Q8. ASP.NET MVC 与 ASP.NET WEB API之间的区别是?
Ans. 主要有如下区别:

  1. ASP.NET MVC 用来建立web应用返回视图和数据;可是ASP.NET WEB API 是用来建立完整的HTTP服务,仅返回数据无视图返回。
  2. WEB API 基于.NET Framework构建REST-ful服务,并支持内容协商(返回客户端须要的格式化的数据,好比json,xml,Atom等)。
  3. WEB API还负责返回特定格式的数据,如JSON,XML或任何其余基于接受请求头中定义的格式;但MVC只能经过JsonResult返回Json格式数据。
  4. WEB API 的请求映射到Http动词对应的action;MVC 的请求直接映射到对应的action name。
  5. ASP.NET WEB API是新的框架和ASP.NET框架核心的一部分。模型绑定,过滤器, 路由和其余MVC功能,在WEB API中存在于System.Web.Http程序集;可是在MVC中这些功能存在于System.Web.Mvc程序集。所以WEB API也能够 与ASP.NET一块儿使用以及做为独立的服务层。
  6. 您能够在单个项目中混合使用WEB API和MVC控制器来处理高级AJAX请求并以JSON,XML或任何其余格式返回数据,并构建完整的HTTP服务。一般,这将是WEB API自承载。
  7. 当你混合使用了MVC和WEB API控制器,你想实现受权那么你必须建立两个过滤器一个为MVC和另外一个为WEB API,由于二者是不一样的。
  8. WEB API 是一个轻量级的框架,不只仅web应用程序可使用,其余智能手机app也可以使用。

Q9. WEB API能返回View吗?
Ans. 与ASP.NET MVC不一样,WEB API仅能返回数据,返回的数据格式能够为string,json,xml,text等。


Q10. 能够如同ASP.NET MVC那样修改WEB API的action name吗?
Ans. 能够,经过使用[ActionName]特性便可修改action name:

[HttpGet]
[ActionName("GetProducts")]
public IEnumerable<Product> ProductList()
{
 return db.Products.AsEnumerable();
}

Q11. 如何限制WEB API的Aciton仅能被HTTP GET,POST,PUT,DELETE访问?
Ans. 简单,和ASP.NET MVC相似,经过使用[HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete]特性来达到这一目的。
好比,若是你想限制一个Action仅能被HTTP Get请求访问,能够在Action上使用[HttpGet]特性便可,以下:

[HttpGet]
public IEnumerable<Product> ProductList()
{
 return db.Products.AsEnumerable();
}

Q12. 如何在ASP.NET MVC中调用 WEB API?
Ans. ASP.NET WEB API 能够经过使用HttpClient请求WEB API地址的方式来调用:

public class ProductController : Controller
{
 HttpClient Client = new HttpClient();
 Uri BaseAddress = new Uri("http://localhost:131/");
 public ActionResult Index()
 {
 Client.BaseAddress = BaseAddress;
 HttpResponseMessage response =
Client.GetAsync("productservice/GetProducts").Result;

 if (response.IsSuccessStatusCode)
 {
 var data = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;
 return View(data);
 }
 return View();
 }
}

Q13. ASP.NET WEB API 路由与 ASP.NET MVC 路由有什么区别?
Ans. ASP.NET MVC 与 ASP.NET WEB API 使用路由来监控传入的请求。主要的区别有如下几点:

  1. 在WEB API 路由模式中 {action}参数是可选的,可是你能够自行包含 一个 {action} 参数。在ASP.NET MVC中 {action} 参数是强制的。
  2. Web Api 控制器中action 要么使用HTTP action 动词 (GET, POST, PUT,
    DELETE) 特性标记或者以HTTP动词做为action方法名命名前缀。
    ASP.NET MVC中action方法默承认以经过 HTTP GET、POST 动词调用。若是须要支持其余HTTP动词,一样须要为其定义特性。
  3. 不像ASP.NET MVC,Web API仅能接收一个复杂类型做为参数。

Q14. ASP.NET WEB API2中如何启用特性路由?
Ans. 简单,仅仅须要在WebApiConfig.cs类的Register()方法添加对MapHttpAttributeRoutes()方法的调用便可。

public static class WebApiConfig
{
 public static void Register(HttpConfiguration config)
 {
 //enabling attribute routing
 config.MapHttpAttributeRoutes();
 }
}

同时你也能够合并使用特性路由和基于约定的路由。

public static class WebApiConfig
{
 public static void Register(HttpConfiguration config)
 {
 //enabling attribute routing
 config.MapHttpAttributeRoutes();
 // Convention-based routing.
 config.Routes.MapHttpRoute(
 name: "DefaultApi",
 routeTemplate: "api/{controller}/{id}",
 defaults: new { id = RouteParameter.Optional }
 );
 }
}

Q15. 如何在ASP.NET WEB API2中定义特性路由?
Ans. 像ASP.NET MVC5那样,能够在WEB API2的controller级别和action级别定义特性路由:

Controller level routing(控制器级别路由)
在控制器级别定义的特性路由将应用到全部action,除非action上指定了特定的路由。

[RoutePrefix("Service/User")]
public class UserController : ApiController
{
 //GET route: api/User
 public IEnumerable<string> Get()
 {
 return new string[] { "value1", "value2" };
 }
 [Route("{id}")] //GET route: Service/User/1
 public string Get(int id)
 {
 return "value";
 }
 [Route("")] //POST route: Service/User/
 public void Post([FromBody]string value)
 {
 }
}

Action level routing(Action级别路由)
给Controller下的特定Action指定路由。

public class UserController : ApiController
{
 //GET route: api/User
 public IEnumerable<string> Get()
 {
 return new string[] { "value1", "value2" };
 }
 [Route("Service/User/{id}")] //GET route: Service/User/1
 public string Get(int id)
 {
 return "value";
 }
 [Route("Service/User/")] //POST route: Service/User/
 public void Post([FromBody]string value)
 {
 }
}
相关文章
相关标签/搜索