本系列主要翻譯自《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) { } }