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)
 {
 }
}
相關文章
相關標籤/搜索