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






4.78/5 (19投票s)
在本文中,我们将探讨 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:
- IIS 托管 - 将 WebApi 托管在 ASP.NET 应用程序内部。
- 自托管 - 让自己的应用程序托管 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 日:初稿