问题

怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中

解决方案

在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合到了 MVC 项目模板中。自 Visual Studio 2013 以后,创建 ASP.Net Web应用程序使用的是一种新的"One ASP.NET"项目向导,在这里可以选择相应的组件,例如,MVC,Web API,WebForm,等等。"One ASP.NET" 是基于微软统一 ASP.NET平台的概念。如图所示 图1-1

图1-1. "One ASP.NET" 项目向导,在一个项目中使用 MVC 和 Web Api

有意思的是,如果你选择了 Web API 项目模板,MVC 的复选框是自动被选中,因为ASP.NET Web API Help Pages 依赖于 MVC 来提供内容。

你也可以在任何已经存在的 MVC 项目中他通过 NuGet 安装"Install-Package Microsofty.Asp.Net.WebApi"来添加 Web API。

其实,上面两种,在 ASP.NET Web 应用项目中,添加 Web API 的方式是等效的,因为项目向导也仅仅是从NuGet 中安装了 ASP.NET Web API。

工作原理

ASP.NET Web API  的构建围绕着一个叫做 System.Web.IHttpAsyncHandler 的异步 HTTP Handler,如演示清单1-1.Handlers 是 ASP.NET 的主干,就是一些可以拦截和处理发送给服务器的 HTTP 请求以及响应相应的请求给客户端的类。

清单 1-1. IhttpAsyncHandler 的定义

1
2
3
4
5
6
public interface IHttpAsyncHandler : object, IHttpHandler
{
    System.IAsyncResult BeginProcessRequest(HttpContext context, System.AsyncCallback cb,
    object extraData);
    void EndProcessRequest(System.IAsyncResult result);
}

事实上,这个和 ASP.NET MVC 框架的体系结构没有多大的不同,他也是位于 Http Hander 上层。其实,他们的框架都是软件工程中复杂的一部分,和常规的 IHttpHandler 或 IHttpAsyncHandler 没有什么特别之处,也许,以前你就创建过处理各种处理基于 HTTP 的工作。

Web API IHttpAsyncHandler 的大致结构——HttpControllerHandler 和他的公共成员,如清单1-2所示

清单 1-2. HttpControllerHandler 的公共成员

1
2
3
4
5
6
public class HttpControllerHandler : HttpTaskAsyncHandler
{
    public HttpControllerHandler(RouteData routeData);
    public HttpControllerHandler(RouteData routeData, HttpMessageHandler handler);
    public override Task ProcessRequestAsync(HttpContext context);
}

MVC 和 Web API 的主要不同是从版本2开始的。Web API Handler-HttpControllerHandler,是HttpTaskAsyncHandler 的一个子类。在 MVC 的版本中,MvcHandler,实现了接口IHttpAsyncHandler。HttpTaskAsyncHandler是在 .NET 4.5 才有的,而 .NET 4.5 是 Web API 2 才支持。

当在同一个 ASP.NET 进程中运行 MVC 和 Web API 的时候,ASP.NET 使用的是HttpApplication。MapRequestHandler事件来决定哪个 HTTP handler 被翻牌子,来处理请求。在这个阶段,进行路由匹配,请求进入到相应匹配路由的 IRouteHandler。IRouteHandler 的唯一目的就是创建一个可以处理请求的 IHttpHandler。

如果 IRouteHandler 是 HttpControllerRouteHandler(Web API 路由),那么,被选择的 Web API 地址路径的请求将被终结在 HttpControllerRouteHandler。相反的,如果路由处理器是 MvcRouteHandler,那么,MVC 的地址路径由 MvcHandler 接管。

代码演示

这一部分要演示的是,ASP.NET MVC 和ASP.NET Web API 将运行在在同一个进程中,他们可以轻而易举的共享状态,例如,静态对象或者 Global.asax 事件。另外,配置文件 web.config 对于两个框架也是通用的。

清单 1-3 展示了两个Controller,MVC Controller 和 ASP.NET Web API Controller,他们可以在一个ASP.NET Web 应用程序共存。值得注意的是,因为他们在不同的命名空间中,所以他们设置可以使用相同的名称。此外,他们可以根据需要共享同一个 model(DTO),非常完美。

清单 1-3. 简单的 MVC 和 Web API 控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Book
{
    public int Id { getset; }
    public string Author { getset; }
    public string Title { getset; }
    public string Link { getset; }
}
Namespace WebApplication.Controllers.Mvc
{
public class BooksController : Controller
{
public ActionResult Details(int id)
{
var book = Books.List.FirstOrDefault(x => x.Id == id);
if(book == nullreturn new HttpNotFoundResult();
return View(book);
}
}
}
namespace WebApplication.Controllers.WebApi
{
public class BooksController : ApiController
{
public Book GetById(int id)
{
var book = Books.List.FirstOrDefault(x => x.Id == id);
if (book == nullthrow new HttpResponseException(HttpStatusCode.NotFound);
return book;
}
}
}

避免两个框架冲突的关键是谨慎惊醒路由设置,为了方便,默认情况下, ASP.NET Web API 将 /api 占位在 URI 下,这样,所有根级别的 URL 将被 MVC 处理。通常情况下,Web API 路由是被定义在 WebApiConfig静态类中,使用 HttpConfiguration 对象和他的 Route 属性。MVC 的路由被定义在 RouteConfig 静态类中,直接使用 System.Web.RouteCollection。两个框架路由的默认定义显示下,清单 1-4.

清单 1-4. Web API 和 MVC 的默认路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Web API 路由配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
//MVC 路由配置
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

第三部分将专门介绍路由,如清单1-4所示,下面的地址是 ASP.NET 应用程序暴露出来的

  • /api/books/{id} 路由到 ASP.NET Web API

  • /books/details/{id} 路由到 ASP.NET MVC

转载于:https://www.cnblogs.com/shuizhucode/p/6022665.html

[水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API相关推荐

  1. 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

    在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发"为xxx执行子请求时出错"的Htt ...

  2. 在WinForm程序中嵌入ASP.NET[转]

    在WinForm程序中嵌入ASP.NET 现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分 ...

  3. iis mvc html,IIS中使用ASP.NET MVC的经验总结

    在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...

  4. java怎么加定时器_JAVA WEB程序中添加定时器

    JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...

  5. 在Spring MVC Web应用程序中添加社交登录:集成测试

    我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但是它并不能真正告诉我们我们的应用程序是否正常运行. 这就是 ...

  6. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  7. [水煮 ASP.NET Web API2 方法论](12-1)创建 OData

    问题 怎样用在 Web API 中创建 OData 服务. 解决方案 对于我们来说,在 Web API 中使用 OData最简单的方式就是使用 ASP.NET 模板来创建Odata Controlle ...

  8. 在WinForm程序中嵌入ASP.NET

    现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分不清什么时候是在本地什么时候是在网络.而这 ...

  9. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    1 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Microsoft Graph 服务针对一些主流的 ...

最新文章

  1. 基于pytorch的模型稀疏训练与模型剪枝示例
  2. 将cocos2dx项目从Visual Studio 迁移到 xcode
  3. python生成wheel包注意事项
  4. 一个简易实用的web权限管理模块的应用与实现
  5. MPU6050参考代码
  6. Use Windows Azure AD to create SSO projects
  7. HDU 1999 不可摸数
  8. C++ STL 遍历 map 的时候如何删除其中的 element
  9. windowsCE异常和中断服务程序初探(=)
  10. 谷歌浏览器主页_谷歌浏览器客服人工服务电话怎样查询-客服人工服务电话查询方法...
  11. Nginx篇--解读nginx配置
  12. 如何用 Excel 排查重复的数据
  13. 2021年最新微信漫画小程序全开源商业版免费下载
  14. 基于STM32CubeMX在STM32F072C8T6移植Contiki OS
  15. 实践小笔记(1) --- DBSCAN
  16. Cloudera Manager 基本介绍(CDH版本)
  17. 如何最大效率压缩视频文件(ffmpeg)
  18. 快手如何引流的话术?在快手引流精准粉丝的技巧
  19. 8086系列微型计算机SP的功能,微机原理与应用 作业
  20. Win10 Pro 和 Win10 家庭版需要密码的局域网共享文件配置

热门文章

  1. 常用数学特殊符号,复制到word中使用
  2. 给element的select添加复选框
  3. React开发(220):缺少form.create
  4. 前端学习(3332):ant design介绍button
  5. react学习(72)--row上面加样式
  6. 前端学习(3228):createRef的使用
  7. [html] 为什么我们要使用web workers?
  8. 工作120:富文本组件封装
  9. 工作67:三级级联问题
  10. 前端学习(1799):前端调试之清除浮动