将库中的 WebApi 控制器托管到 IIS
Hosting WebApi Controllers from a library into IIS
我在 class 库中有一些 WebApi 控制器,我想在 IIS 中托管它们。我知道在控制台应用程序或 windows 服务中自托管的解决方案,但这只适合本地使用。我如何解决 Asp.Net Web/WebApi 应用程序中的控制器程序集,该应用程序实际上非常适合在 IIS 中托管?
我只在不同的托管场景中寻找类似这种方法的方法:
http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api
据我所知,最简单的方法是利用 Attribute Routing
例子
以包含 ApiController 的示例 class 库为例。使用属性路由,我们可以用路由装饰class。
//Inside API controller class library
[RoutePrefix("Persons")]
public class PersonController : ApiController
{
[Route("")]
public List<Person> GetAll()
{
List<Person> results = new List<Person>();
try
{
//TODO: Call Data Access Layer
//FORNOW: Mock up some data
results.Add(new Person() { Name = "Ryan C" });
results.Add(new Person() { Name = "Siavash R" });
}
catch
{
//TODO: Handle error
}
return results;
}
}
一旦正确路由,上述代码将响应 /Persons
的 HTTP 请求。
现在,在将托管在 IIS 中的 WebApi 项目中,您需要执行以下操作:
添加对您的 class 库的引用
我知道这可能是 'duh' 但只是例行公事地放在这里。您需要在 WebApi 项目中添加对 API 控制器 class 库的引用。
创建注册方法
无论是在 App_Start\RouteConfig.cs
还是在新的 App_Start\WebApiConfig.cs
中,您都调用 MapHttpAttributeRoutes();
,如下所示:
//Inside App_Start\WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Map all Web API routes
config.MapHttpAttributeRoutes();
}
}
ASP.NET 框架足够智能,可以搜索任何引用的程序集并查找 public ApiController 派生的 classes,在本例中,是为属性路由装饰的。
调用Global.asax
中的注册方法
最后一步就是实际调用Global.asax文件中的注册方法:
//Inside Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
在那之后,你应该可以开始了!我在本地测试了它,构建了一个完整的示例并且它工作得很好。如果需要我可以post我的示例项目github,但是上面的代码是重点。
调用 http://localhost:xxxx/Persons/
结果如下:
<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Ryancdotnet.WebApiClassLib.Model">
<Person>
<Name>Ryan C</Name>
</Person>
<Person>
<Name>Siavash R</Name>
</Person>
</ArrayOfPerson>
供参考,以备不时之需,我的 ApiController class 库使用了这些 Nuget 包。我不确定哪些是完全必要的,但这些对于 class 库来说已经足够了。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net46" />
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net46" />
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net46" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net46" />
<package id="System.Web.Http.Common" version="4.0.20126.16343" targetFramework="net46" />
</packages>
API-ing 快乐!
我在 class 库中有一些 WebApi 控制器,我想在 IIS 中托管它们。我知道在控制台应用程序或 windows 服务中自托管的解决方案,但这只适合本地使用。我如何解决 Asp.Net Web/WebApi 应用程序中的控制器程序集,该应用程序实际上非常适合在 IIS 中托管?
我只在不同的托管场景中寻找类似这种方法的方法: http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api
据我所知,最简单的方法是利用 Attribute Routing
例子
以包含 ApiController 的示例 class 库为例。使用属性路由,我们可以用路由装饰class。
//Inside API controller class library
[RoutePrefix("Persons")]
public class PersonController : ApiController
{
[Route("")]
public List<Person> GetAll()
{
List<Person> results = new List<Person>();
try
{
//TODO: Call Data Access Layer
//FORNOW: Mock up some data
results.Add(new Person() { Name = "Ryan C" });
results.Add(new Person() { Name = "Siavash R" });
}
catch
{
//TODO: Handle error
}
return results;
}
}
一旦正确路由,上述代码将响应 /Persons
的 HTTP 请求。
现在,在将托管在 IIS 中的 WebApi 项目中,您需要执行以下操作:
添加对您的 class 库的引用
我知道这可能是 'duh' 但只是例行公事地放在这里。您需要在 WebApi 项目中添加对 API 控制器 class 库的引用。
创建注册方法
无论是在 App_Start\RouteConfig.cs
还是在新的 App_Start\WebApiConfig.cs
中,您都调用 MapHttpAttributeRoutes();
,如下所示:
//Inside App_Start\WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Map all Web API routes
config.MapHttpAttributeRoutes();
}
}
ASP.NET 框架足够智能,可以搜索任何引用的程序集并查找 public ApiController 派生的 classes,在本例中,是为属性路由装饰的。
调用Global.asax
中的注册方法最后一步就是实际调用Global.asax文件中的注册方法:
//Inside Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
在那之后,你应该可以开始了!我在本地测试了它,构建了一个完整的示例并且它工作得很好。如果需要我可以post我的示例项目github,但是上面的代码是重点。
调用 http://localhost:xxxx/Persons/
结果如下:
<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Ryancdotnet.WebApiClassLib.Model">
<Person>
<Name>Ryan C</Name>
</Person>
<Person>
<Name>Siavash R</Name>
</Person>
</ArrayOfPerson>
供参考,以备不时之需,我的 ApiController class 库使用了这些 Nuget 包。我不确定哪些是完全必要的,但这些对于 class 库来说已经足够了。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net46" />
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net46" />
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net46" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net46" />
<package id="System.Web.Http.Common" version="4.0.20126.16343" targetFramework="net46" />
</packages>
API-ing 快乐!