本系列主要翻译自《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. Jquery实现的几款漂亮的时间轴

    引言 最近项目中使用了很多前端的东西,对于我一个做后台开发的人员,这是一个很好的锻炼的机会.经过这段时间的学习,感觉前端的东西太多了,太强大了,做出来的东西太炫酷了.现在有很多开源的前端框架,做的都非 ...

  2. [转载] HTTP协议详解

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  3. 有关C#分部类型的一些叙述

    等待着元宵节的到来,过完元宵,这个年也算是过完了,也得开始出去挣钱了,过年回家感觉每个人都觉得很牛,只有自己太渣,为了避免年底再出现这样尴尬的局面,还是需要努力干活.争取当上CEO,赢取白富美,走上人 ...

  4. C#文本框允许使用ctrl+A

    C#文本框中默认是不允许使用全选的.可以通过以下事件完成: private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.C ...

  5. 使用devstack搭建openstack Newton 版本的坑

    国外源访问速度慢怎么办? 使用国外源,加之带宽紧张,搭建过程是很累的,这里推荐大家使用一下源: devstack包源.:http://git.trystack.cn pip源: [global] in ...

  6. java byte【】数组与文件读写(增加新功能)

    今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: ...

  7. Java基于文件的对象存储

    工作中经常需要处理对象的处理,有的时候还需要将对象保存到文件中做持久化. 特别是当不能使用数据库的时候就特别需要一个简单的对象集合的增删改查操作, 于是就有了下面这个文件DB的工具类 package ...

  8. 非名校毕业年薪20W程序员 心得分享

    大家好,我是落落http://blog.csdn.net/robinson1988/ QQ692162374,其实我选择Oracle是一件很神奇的事情,但是现在回想起来又觉得是命中注定.我2006年就 ...

  9. HTML学习一

    今天主要学习HTML的 table 标签 和 form 标签,作品如下: <html> <head> <title>新增雇员</title> </ ...

  10. 用qemu搭建aarch64学习环境

    作者信息 作者: 彭东林 邮箱: pengdonglin137@163.com QQ: 405728433 软件平台 主机: Ubuntu14.04 64位版本 模拟器:Qemu-2.8.0 Linu ...