本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分,ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點是以面試問答的形式進行展開。通讀此書,會幫助你對ASP.NET MVC有更深層次的理解。
由於個人技術水平和英文水平也是有限的,因此錯誤在所難免,希望大家多多留言指正。
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(可緩存) - 客戶端應該能夠緩存響應以供后續使用。
Q3. REST和 SOAP間的區別是什么?
Ans. 詳見下表:
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 功能
- 它支持基於約定的CRUD操作因為它支持HTTP 動詞 GET, POST, PUT , DELETE。
- 響應包含http狀態碼和Accept header。
- 響應被WEB API中的
MediaTypeFormatter
格式化為JSON, XML或者任何你想添加作為MediaTypeFormatter
的任何格式。 - 它可以接收和生成非面向對象的內容比如圖像!PDF等。
- 它已經自動支持
OData
。因此將[Queryable]
特性添加到controller的方法中,它將會返回IQueryable
結果, 客戶端可以使用該方法進行OData組合查詢。 - 可以在IIS或應用程序中寄宿。
- 它支持 MVC 的許多功能,比如routing, controllers, action results, filter, model binders, IOC container or dependency injection 。
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?
- 如果我們需要web service但不需要 SOAP,那么ASP.NET WEB API將是最佳選擇。
- 它在現有WCF消息管道之上,構建簡單的,基於非SOAP的HTTP服務。
- 它不像WCF REST service那樣需要配置乏味的配置文件。
- 使用WEB API創建服務十分簡單。
- 基於HTTP並且容易定義,以REST方式公開和使用。
- 它是輕量級的架構,適用於有限帶寬的設備,如智能手機。
- 開源。
Q6. WCF、WEB API、 WCF REST 、Web Service之間的區別是?
Ans. 主要區別是:
Web Service
- 基於SOAP協議,返回xml數據格式。
- 僅支持HTTP協議。
- 非開源,只要客戶端能解析xml就可以使用。
- 只能在IIS上掛載。
WCF
- 基於SOAP協議,返回xml數據格式
- 它是web service(ASMX)的演化版。支持TCP, HTTP, HTTPS, Named Pipes, MSMQ。
- 需要額外配置大量繁瑣的配置項。
- 非開源,只要客戶端能解析xml就可以使用。
- 可以在應用程序或IIS或window service上承載。
WCF Rest
- 將WCF 作為 WCF Rest 服務使用,您必須啟用 webHttpBindings.
- 支持HTTP GET和POST,分別對應使用 [WebGet] 和 [WebInvoke] 特性。
- 如果需要支持其他HTTP動詞,你需要在.svc文件中針對需要支持的HTTP動詞做一些配置。
- 使用WebGet通過參數傳遞數據,需要配置。同時,UriTemplate 必須指定。
- 支持XML, JSON 和 ATOM 數據格式。
WEB API
- 一種新的框架提供了簡易的方式用來搭建HTTP services。
- WEB API是一個開源的理想的平台在.NET Framework上搭建REST-ful services。
- 它使用HTTP的完整功能(像 URIs, request/response headers, caching,
versioning, various content formats)。 - 它也同時支持MVC一樣的功能(routing, controllers, action results, filter, model binders, IOC container or dependency injection, unit testing),使得它更簡單強健。
- 可以在應用程序或IIS中承載。
- 它是輕量級的架構,支持多種設備特別是有帶寬限制的設備比如智能手機。
- 響應被WEB API的
MediaTypeFormatter
格式化為 JSON、 XML或者任何你想要添加作為MediaTypeFormatter
的任何格式。
Q7. 在WCF 和 WEB API之間如何選擇?
Ans. 可以從以下幾點進行考慮:
- 需要支持特別的場景,比如:one way messaging(單向通信),message queues(消息隊列),duplex communication(全雙工通信)等,選擇WCF。
- 當您想創建一個可以使用快速傳輸通道的服務時,請選擇WCF,如TCP,命名管道,或者甚至UDP(在WCF 4.5),並且當所有其他通道不可用時能夠支持HTTP傳輸信道。
- 當您要通過HTTP創建面向資源的服務時選擇WEB API,因為其可以使用完整的 HTTP的特性(如URI,請求/響應頭,緩存,版本控制,各種內容格式)。
- 如果您希望將服務公開給廣泛的客戶端(包括瀏覽器, 手機,iphone和平板電腦),選擇WEB API。
Q8. ASP.NET MVC 與 ASP.NET WEB API之間的區別是?
Ans. 主要有以下區別:
- ASP.NET MVC 用來創建web應用返回視圖和數據;但是ASP.NET WEB API 是用來創建完整的HTTP服務,僅返回數據無視圖返回。
- WEB API 基於.NET Framework構建REST-ful服務,並支持內容協商(返回客戶端需要的格式化的數據,比如json,xml,Atom等)。
- WEB API還負責返回特定格式的數據,如JSON,XML或任何其他基於接受請求頭中定義的格式;但MVC只能通過JsonResult返回Json格式數據。
- WEB API 的請求映射到Http動詞對應的action;MVC 的請求直接映射到對應的action name。
- ASP.NET WEB API是新的框架和ASP.NET框架核心的一部分。模型綁定,過濾器, 路由和其他MVC功能,在WEB API中存在於System.Web.Http程序集;但是在MVC中這些功能存在於System.Web.Mvc程序集。因此WEB API也可以 與ASP.NET一起使用以及作為獨立的服務層。
- 您可以在單個項目中混合使用WEB API和MVC控制器來處理高級AJAX請求並以JSON,XML或任何其他格式返回數據,並構建完整的HTTP服務。通常,這將是WEB API自承載。
- 當你混合使用了MVC和WEB API控制器,你想實現授權那么你必須創建兩個過濾器一個為MVC和另一個為WEB API,因為兩者是不同的。
- 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 使用路由來監控傳入的請求。主要的區別有以下幾點:
- 在WEB API 路由模式中 {action}參數是可選的,但是你可以自行包含 一個 {action} 參數。在ASP.NET MVC中 {action} 參數是強制的。
- Web Api 控制器中action 要么使用HTTP action 動詞 (GET, POST, PUT,
DELETE) 特性標記或者以HTTP動詞作為action方法名命名前綴。
ASP.NET MVC中action方法默認可以通過 HTTP GET、POST 動詞調用。如果需要支持其他HTTP動詞,同樣需要為其定義特性。 - 不像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)
{
}
}