c# - 将库中的 WebApi Controller 托管到 IIS

标签 c# asp.net iis asp.net-web-api self-host-webapi

我在类库中有一些 WebApi Controller ,我想在 IIS 中托管它们。我知道在控制台应用程序或 Windows 服务中自托管的解决方案,但这只适合本地使用。我如何解决实际上非常适合在 IIS 中托管的 Asp.Net Web/WebApi 应用程序中的 Controller 程序集?

我只在不同的托管场景中寻找类似这种方法的方法: http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api

最佳答案

我知道最简单的方法是利用 Attribute Routing

例子

以包含 ApiController 的示例类库为例。使用属性路由,我们可以用路由装饰类。

//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 项目中,您需要执行以下操作:

添加对类库的引用

我知道这可能是个“废话”,但只是例行公事地把它放在这里。您需要在 WebApi 项目中添加对 API Controller 类库的引用。

创建注册方法

无论是在 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 派生类,在本例中,是为属性路由修饰的类。

在Global.asax中调用注册方法

最后一步是实际调用Global.asax文件中的注册方法:

//Inside Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

在那之后,你应该可以开始了!我在本地测试了它,构建了一个完整的示例并且它工作得很好。如果需要我可以将我的示例项目发布到 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 类库使用了这些 Nuget 包。我不确定哪些是完全必要的,但这些对于类库来说已经足够了。

<?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 愉快!

关于c# - 将库中的 WebApi Controller 托管到 IIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136631/

相关文章:

windows - IIS 401.3 与 Windows 身份验证 2016

c# - 为什么 ActualHeight 与我在 WinRt XAML 中为网格的高度指定的不完全相同?

c# - 为什么我的 App.Config 有这种奇怪的程序集重定向?

asp.net - 用户下线时间

iis - IIS 7.5和图像未缓存

.net - 连接字符串中的集成安全性

c# - 使用 Reflection.Emit 发射对象数组时出现问题

c# - 在布局 View 上填充 ViewBag

asp.net - 创建一个操作过滤器属性,绕过操作的实际执行并为其返回一个值

c# - 从字符串中剥离 WordML