本系列主要翻译自《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 功能
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
WCF
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)
{
}
}