65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET WebApi 托管新手教程(IIS 托管和自托管)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (19投票s)

2013年12月27日

CPOL

4分钟阅读

viewsIcon

122827

downloadIcon

3286

在本文中,我们将探讨 ASP.NET WebApi 的各种托管方式。

引言

在本文中,我们将探讨 ASP.NET WebApi 的各种托管方式。 

背景

此前,在一篇文章(ASP.NET Web API 理解与实现新手教程[^])中,我们已经了解了 WebApi 的基础知识以及如何创建一个简单的 WebApi。我们还研究了一个使用后端 WebApi 的单页应用程序(使用 Backbone.js 和 Marionette.js 创建单页应用程序的新手指南[^])。在这两个项目中,WebApi 都托管在 ASP.NET 应用程序内部,即 IIS 托管。如果我们开发的 WebApi 将被设备应用程序使用,那么不一定非要将其作为 Web 应用程序(IIS 托管)来托管。在本文中,我们将探讨 ASP.NET WebApi 的各种托管方式。

使用代码 

在第一篇文章中,我们了解了 WebApi 的基础知识。我们看到了如何在 ASP.NET MVC 4 应用程序中轻松添加 WebApi。当我们使用 ASP.NET 框架托管 WebApi 时,我们实际上是在 IIS 中托管它。但是,并非必须有一个 ASP.NET WebApi 来托管 WebApi。换句话说,我们不必总是将 WebApi 托管在 IIS 中。事实上,WebApi(类似于 WCF 服务)最棒的地方在于它提供了将其自身托管在任何应用程序中的灵活性。

所以,我们可以通过两种方式托管 WebApi: 

  1. IIS 托管 - 将 WebApi 托管在 ASP.NET 应用程序内部。
  2. 自托管 - 让自己的应用程序托管 ASP.NET WebApi。

让我们详细了解这两种方法。

IIS 托管 - 将 WebApi 托管在 ASP.NET 应用程序内部

当我们将在 ASP.NET 应用程序内部托管 WebApi 时,ASP.NET 托管基础结构将负责 WebApi 的所有托管需求。如果我们选择在 ASP.NET 应用程序内部托管 WebApi,我们就无需手动进行太多操作。如果我们想创建一个将在 ASP.NET 网站(即 IIS)内部托管的 WebApi,我们需要执行以下步骤。

创建新的 ASP.NET MVC4 项目

 

注意:我们也可以使用 NuGet 包管理器将 WebApi 添加到现有的 ASP.NET MVC 4 应用程序中。

选择项目类型为 WebApi 

 

这将会在 WebApiConfig 中创建路由,如下所示:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

此外,它还会创建一个示例 WebApi 控制器 ValuesController

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable< string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

注意:本文将不创建任何 Api 控制器,因为本文的主要目的是探讨托管选项。有关如何实现控制器的更多信息,请参阅第一篇文章。

当我们运行此应用程序时,Web 应用程序将由开发服务器运行,该开发服务器将托管其中包含的 WebApi。让我们运行项目并使用 Postman 测试我们的 WebApi。

 

同样,一旦我们完成开发,我们所要做的就是将该 Web 应用程序托管在 IIS 中,然后我们的 WebApi 将被托管在 IIS 中。

自托管 - 让自己的应用程序托管 ASP.NET WebApi

现在,当我们尝试在自己的应用程序中托管 WebApi 时,我们需要负责所有的配置。因为在 IIS 托管中,所有与托管相关的配置都来自 IIS 配置或网站配置,所以我们无需执行此步骤。但是,当我们想自托管 WebApi 时,我们需要创建自己的 HttpSelfHostServer 服务器来执行 IIS 的功能,并且为了提供配置,我们需要手动定义所有配置。

话不多说,让我们看看如何让一个简单的控制台应用程序托管 WebApi。为此,我们需要做的第一件事就是使用 NuGet 包管理器安装所有依赖/必需的包。

 

创建 HttpSelfHostConfiguration 类的实例。它将负责我们 WebApi 所需的所有配置。现在,让我们仅配置此 WebApi 将运行的 URI。

Uri myUri = new Uri(@"https://:9999");
// Let have our configurations readY
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(myUri); 

接下来,我们需要准备路由配置并将其附加到此配置对象。 

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

现在,我们使用上面看到的相同的 ValuesController 类,作为处理 WebApi 请求的控制器。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable< string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

现在我们有了一个配置对象,其中包含一些最小配置,即要侦听的 URI 和路由。一个简单的 ValuesController 已准备好处理我们的请求。现在让我们创建一个 HttpSelfHostServer 的实例,并使用上述配置对象。然后我们将异步打开服务器。

HttpSelfHostServer server = new HttpSelfHostServer(config);

// Start listening 
server.OpenAsync().Wait();

// Wait for it :)
Console.WriteLine("WebApi hosted on " + myUri.AbsoluteUri +" It can be tested now");
Console.ReadLine();

 

WebApi 并未在此控制台应用程序中托管。让我们继续从 Postman 测试此 WebApi。

 

关注点

在本文中,我们了解了如何在 IIS(ASP.NET Web 应用程序)中托管 WebApi,以及如何自托管 WebApi。一个有趣的事情可能是使用 Open Web Interface for .NET (OWIN) 来自托管 WebApi。本文是从初学者角度编写的。希望本文内容有所帮助。

历史

  • 2013 年 12 月 27 日:初稿
© . All rights reserved.