Asp.net web api 知多少

时间:2023-06-03 14:04:50

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

  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。

Asp.net 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上挂载。

WCF

  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也可使用。

    Asp.net web api 知多少

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)
{
}
}