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

问题

  怎么样将 Asp.Net Web Api 加入到 Asp.Net Web From 应用程序中

 

解决方案

   Visual Studio 2013 中,创建新的 Web From,可以直接在"新建 ASP.NET 项目创建项目向导中,勾选ASP.NET Web API ,将其加入进来。如图 1-2 所示。

 

 wKiom1gZ-CnSlNf0AACOJzJ-fnk328.png-wh_50

 

图 1-2. Asp.NET 项目向导,同时选中 Web Form  Web API

 

  因为可以通过 NuGet 添加 ASP.NET Web API ,所以使用“Install-Package Microsoft.AspNet.WebApi”就可以轻易将其添加到现有的 Web Form 解决方案中。

   Visual Studio 2012 中使用也很简单,只要创建一个 WebForm 项目,然后通过NuGet 来安装 Web API 就可以。

 

工作原理

和在 MVC 中使用 ASP.NET Web API 一样,在 Web Form 项目中ASP.NET Web API 使用 的结果就是,Web API Web Form 应用程序运行在同一个 ASP.NET 进程中。

   ASP.NET 项目中安装 Microsoft.AspNet.WebApi NuGet 包时,会在 App_Start文件夹中添加  WebApiConfig  静态类。这个文件是用来配置 ASP.NET Web API 和定义 ASP.NET Web API 路由。

  另外,在 Global.asax 中的 Application_Start 可以找到被添加的代码,就像下面的代码片段,调用 Web API配置。

1
GlobalConfiguration.Configure(WebApiConfig.Register);

 

  Web API 运行在  Web Form 应用程序中与 运行在 MVC 应用程序中没什么不同。每个请求仍将被相关的IHttpHandler 处理。可能是用于处理 Web API  HttpControllerHandler 或者是用于处理 Web Form 的处理器。Web Form 相关的 ASPX 扩展名会交给 PageHandlerFactory,依次调用相关的 IHttpHandler 来处理 HTTP请求。System.Web.UI.Page 类是 Web Form 应用程序的默认组成部分,也是一个 IHttpHandler,其实他才是请求处理器的真正执行者。

 

代码演示

清单 1-5 展示了一个简单的模型类,这个模型是ApiController  Web Form 页展示数据的共享类。

 

清单 1-5. 简单模型,Web Form 页,和 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
public class Book{
    public int Id { getset; }
    public string Author { getset; }
    public string Title { getset; }
}public partial class _Default : Page{
    protected void Page_Load(object sender, EventArgs e)
    {
        int id;
        if (Int32.TryParse((string)Page.RouteData.Values["id"], out id))
        {
            var book = Books.List.FirstOrDefault(x => x.Id == id);
            if (book == null)
            {
                Response.StatusCode = 404;
                return;
            }
            ltlAuthor.Text = book.Author;
            ltlTitle.Text = book.Title;
            hplLink.NavigateUrl = "/api/books/" + book.Id;
        }
        Response.StatusCode = 404;
    }
}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;
    }
}

 

  这是一个约定,在解决方案的 Cotrollers 文件夹中放 ApiController,但是,这并不意味着这是强制要求;在当前应用程序中,只要被声明为 public 的类,类名以Controller 为后缀的 IHttpController 实现类,都会被运行时发现,也会被当成一个可以处理的 HTTP 请求。

  就像 Web API  MVC 一块儿运行一样,当使用 Web Form 路由,我们也必须留心那些要被 Web API 处理的路由和那些要导向 ASPX 页面之间引起的冲突。列表 1-6 展示了 Web Form  Web API的简单路由设置。ASP.NET Web API 路由是在 WebApiConfig 的静态类中设置的,然而,Web Form 路由是在RouteConfig 静态类中设置的。

 

列表 1-6. Web API 路由和 Web Form 路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static class RouteConfig{
    public static void RegisterRoutes(RouteCollection routes)
    {
        var settings = new FriendlyUrlSettings();
        settings.AutoRedirectMode = RedirectMode.Permanent;
        routes.EnableFriendlyUrls(settings);
        routes.MapPageRoute(
        "book-route",
        "book/{id}",
        "~/default.aspx");
    }
}public static class WebApiConfig{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services        // Web API routes        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
        );
    }
}

 

posted @ 2016-11-09 07:12  水煮Code  阅读(2438)  评论(0编辑  收藏  举报