在之前的一篇文章中,介绍了WebApi的基础知识以及如何创建一个简单的WebApi。还探讨了一个使用WebApi作为后端的单页应用程序。在这两个项目中,WebApi都是作为ASP.NET应用程序的一部分托管在IIS中的。如果正在开发的WebApi将被设备应用程序使用,那么并不总是需要将其作为Web应用程序(IIS托管)来托管。在本文中,将探讨ASP.NET WebApi可以被托管的不同方式。
当在ASP.NET应用程序中托管WebApi时,ASP.NET托管基础设施会负责WebApi的所有托管需求。如果选择在ASP.NET应用程序中托管WebApi,不需要手动做太多事情。如果想要创建一个将被托管在ASP.NET网站(即IIS)中的WebApi,需要执行以下步骤:
注意:也可以使用NuGet包管理器在现有的ASP.NETMVC 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 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中。
现在,当尝试在自己的应用程序中托管WebApi时,需要负责所有的配置。由于在IIS托管中,所有与托管相关的配置都是从IIS配置或网站配置中获取的,不需要执行此步骤。但是,当需要自托管WebApi时,需要创建自己的HttpSelfHostServer服务器来执行IIS的部分工作,为此需要手动定义所有配置。
让尝试看看如何让一个简单的控制台应用程序托管WebApi。首先,需要使用NuGet包管理器拥有所有依赖/所需的包。
创建一个HttpSelfHostConfiguration类的实例。这将负责WebApi所需的所有配置。现在让只配置这个WebApi将运行的URI。
Uri myUri = new Uri("http://localhost:9999");
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 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);
server.OpenAsync().Wait();
Console.WriteLine("WebApi hosted on " + myUri.AbsoluteUri + " It can be tested now");
Console.ReadLine();
WebApi并没有托管在这个控制台应用程序中。让继续并使用Postman测试这个WebApi。