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

所以,如果你想以快速且简单的方式暴露你的服务端数据到浏览器端和现代设备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也可使用。


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

Asp.net web api 知多少的更多相关文章

  1. ASP.NET Web API Model-ParameterBinding

    ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...

  2. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  3. ASP.NET Web API 简介

    ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RES ...

  4. Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)

    导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html. 本文主要来讲解以下内容: ...

  5. ASP.NET Web API 特性

    ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RES ...

  6. 【ASP.NET Web API教程】4.2 路由与动作选择

    原文:[ASP.NET Web API教程]4.2 路由与动作选择 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 4.2 Routing ...

  7. Parameter Binding in ASP.NET Web API(参数绑定)

    Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...

  8. ASP.NET Web API 2 消息处理管道

    Ø  前言 ASP.NET 的应用程序都会有自己的消息处理管道和生命周期,比如:ASP.NET Web 应用程序(Web Form).ASP.NET MVC,还有本文将讨论的 ASP.NET Web ...

  9. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

随机推荐

  1. Codeforces374B

    B. Inna and Nine time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  2. 【G】开源的分布式部署解决方案 - 预告篇

    为什么想到要做分布式部署解决方案? 当项目越做越大以后,你会发现部署变成一件极其头疼的事情.当然头疼的绝不仅仅在部署一个环节,比如新服务器环境搭建当中就许多坑要踩.各种重复性的工作,包括但不仅限于增加 ...

  3. 通过Spring Data Neo4J操作您的图形数据库

    在前面的一篇文章<图形数据库Neo4J简介>中,我们已经对其内部所使用的各种机制进行了简单地介绍.而在我们尝试对Neo4J进行大版本升级时,我发现网络上并没有任何成型的样例代码以及简介,而 ...

  4. 《JAVASCRIPT高级程序设计》window/location/navigator/screen/history对象

    如果要在web中使用JAVASCRIPT,那么BOM(浏览器对象模型)毫无疑问是最重要的部分.BOM提供了很多对象,例如,window.location.navigator.screen.histor ...

  5. [python]Python2编码问题

    以下内容说的都是 python 2.x 版本 简介 基本概念 Python "帮"你做的事情 推荐姿势 基本概念 我们看到的输入输出都是'字符'(characters),计算机(程 ...

  6. JAVA逻辑运算符

    逻辑运算符,用于链接boolean类型的表达式. AND与 (&)OR或 (|)XOR异或 (^)Not非 (!)AND双与短路 (&&)OR双与短路 (||) 与(& ...

  7. SQL中如何使用EXISTS替代IN

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6385312.html 我们在程序中一般在做SQL优化的时候讲究使用EXISTS带替代IN的做 ...

  8. 5. UITest测试总结

    1. 什么是Mock 当我们在做单元测试的过程中,为了保持测试又短又快和测试的隔离性,希望尽可能少地去实例化一些具体的组件.在现在面向对象的系统中,被测试的对象很可能会依赖于几个其他的对象,这时候我们 ...

  9. https post

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  10. STL源码剖析(读书笔记)

    STL迭代器种类 2. 迭代器型别使用范例: 3. SGI STL空间配置器分为两级: 4. Vector 的内部存储方式为数组,随机访问迭代器. 5. Vector的size获取方式: 6. Vec ...