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


    问题

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

    解决方案

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

    wKioL1gYrnLxmN1JAABwJvwFdVU695.png-wh_50

    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,实现了接口IHttpAsyncHandlerHttpTaskAsyncHandler是在 .NET 4.5 才有的,而 .NET 4.5  Web API 2 才支持。

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

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

     

    代码演示

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

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

    清单 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

  • 相关阅读:
    xml DTD中的ELEMENT和ATTLIST
    xml CDATA
    xml 及其语法
    java 多态的好处
    libusb-win32 在visual studio2008中成功编译回忆录
    【转帖】C# DllImport 系统调用使用详解 托管代码的介绍 EntryPoint的使用
    【转帖】.Net中C#的DllImport的用法
    .net 中的DllImport
    离线安装谷歌扩展
    排序算法哪家强?
  • 原文地址:https://www.cnblogs.com/shuizhucode/p/6022665.html
Copyright © 2020-2023  润新知