本系列主要翻译自《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 功能浏览器
MediaTypeFormatter
格式化为JSON, XML或者任何你想添加做为 MediaTypeFormatter
的任何格式。OData
。所以将 [Queryable]
特性添加到controller的方法中,它将会返回 IQueryable
结果, 客户端可使用该方法进行OData组合查询。Q5. 为何要选择ASP.NET WEB API?
Ans. 现在,基于Web的应用程序已经远不能知足客户需求。在平常生活中人们使用iphone,手机,平板等。这些设备有一系列的app软件来提供便利的服务。所以咱们的关注点再也不仅仅是web还有app。缓存
因此,若是你想以快速且简单的方式暴露你的服务端数据到浏览器端和现代设备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?服务器
Q6. WCF、WEB API、 WCF REST 、Web Service之间的区别是?
Ans. 主要区别是:
Web Service架构
WCFmvc
WCF Rest
WEB API
MediaTypeFormatter
格式化为 JSON、 XML或者任何你想要添加做为 MediaTypeFormatter
的任何格式。Q7. 在WCF 和 WEB API之间如何选择?
Ans. 能够从如下几点进行考虑:
Q8. ASP.NET MVC 与 ASP.NET WEB API之间的区别是?
Ans. 主要有如下区别:
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 使用路由来监控传入的请求。主要的区别有如下几点:
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) { } }