​原文地址:ASP.NET Core Module overview​

By ​​Tom Dykstra​​​, ​​Rick Strahl​​​, and ​​Chris Ross​

ASP.NET Core模块(ANCM)让你能够在IIS之后运行ASP.NET Core应用,IIS和​​Kestrel​​各司其职,前者专于安全性,可管理性等方面,后者专于性能,我们从两种技术中都能获得益处。ANCM只和Kestrel协同工作,它不兼容于Weblistener​。

支持的Windows版本:

  • Windows 7和Windows Server 2008 R2和更高版本

​查看或下载代码示例​

ASP.NET Core 模块做了什么

ANCM是一个原生的IIS模块,它挂接到IIS管道,并将流量重定向到后端ASP.NET Core应用。其他大多数模块,如windows身份认证,仍然有机会运行。ANCM只在当一个handler被请求选择时进行控制,handler映射配置在应用的web.config文件中定义。

因为ASP.NET Core应用运行在某个IIS工作进程分离出的一个进程中,ANCM也能进行进程管理。当接收到第一个请求的时候,ANCM会为该ASP.NET Core应用启动进程。ANCM也有重启崩溃进程的功能。和运行在IIS进程中,通过WAS(Windows Activation Service)进行管理的传统ASP.NET 应用,在本质上是相同的。

下图说明了IIS,ANCM以及ASP.NET Core应用三者之间的关系

来自Web端的请求首先会触发内核模块HTTP.SYS驱动程序,HTTP.SYS将请求转接到IIS主端口(80)或SSL端口(443)。接下来请求会转向应用程序中配置的HTTP端口,该端口不再是80/443端口。再之后Kestrel捕获请求,推送到ASP.NET Core中间件管道中,并将其作为一个​​HttpContext​​实例供应用程序逻辑处理。最后应用的响应信息将重传回IIS,由IIS将其传回到原先发起请求的HTTP客户端。

ANCM 还有一些其他功能:

  • 设置环境变量。
  • 日志以标准输出形式输出到文件存储中。
  • 转寄Windows身份认证tokens。

怎么在ASP.NET Core应用中使用ANCM

这一节提供了对IIS服务器和ASP.NET Core应用设置过程的概述。更详细的信息,请参考​​发布到IIS​​。

安装 ANCM

ANCM已经被安装在服务器IIS和开发机器IIS Express中。对于服务器而言,ANCM被包括在 ​​ASP.NET Core Server Hosting Bundle​​ 中。对于开发机器而言,Visual Studio会自动为IIS Express和IIS(如果IIS已经被安装在开发机器中)安装ANCM。

安装 IISIntegration NuGet 包

在应用中可以安装Microsoft.AspNetCore.Server.IISIntegration。这是一个互操作性包,它可以读取通过ANCM广播的环境变量以设置你的应用。环境变量提供相应配置信息,例如端口侦听。

调用 UseIISIntegration

在应用的​​Main​​​方法中,可以调用位于​​WebHostBuilder​​​的​​UseIISIntegration​​扩展方法

public static int Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();

var builder = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseConfiguration(config)
.UseStartup<Startup>()
.UseUrls("http://localhost:5001")
.UseIISIntegration()
.UseKestrel(options =>
{
if (config["threadCount"] != null)
{
options.ThreadCount = int.Parse(config["threadCount"]);
}
});

var host = builder.Build();
host.Run();

return 0;
}

​UseIISIntegration​​​方法会查找ANCM设置的环境变量,如果没找到它将什么也不做。这种机制有利于例如​​在MacOS上开发测试程序并部署到运行IIS的服务器​​的场景。当在Mac上运行时,Kestrel以web服务器的身份存在,但是当应用部署到IIS环境时,它会自动搭接ANCM和IIS。

不要调用UseUrls

ANCM会生成一个动态端口以分配给后端进程。​​IWebHostBuilder.UseIISIntegration​​​拿着这个动态端口并配置Kestrel以侦听​​http://locahost:{dynamicPort}/​​​。这将覆盖其他的URL配置,例如​​IWebHostBuilder.UseUrls​​​。因此,在你使用ANCM时你不需要调用​​UseUrls​​​。当你不借助IIS运行应用时,它将会侦听默认端口号​​http://localhost:5000​​。

当不借助IIS运行应用时,如果你仍需要设置端口号,你可以调用​​UseURLs​​​。此种情况下,​​IISIntegration​​​不会做任何事情,你提供给​​UseUrls​​​的端口号也将生效。但是当你借助IIS运行应用时,由ANCM动态生成的端口号将覆盖你传递给​​UseUrls​​的任何设置信息。

在ASP.NET Core 1.0中,​​UseUrls​​的调用需要放在IISIntegration之前,这是为了防止ANCM配置的端口被重写。但是在ASP.NET Core 1.1中,因为ANCM设置总是会覆盖​​UseUrls​​,这样的调用顺序将不会再有效。

在Web.config中设置ANCM选项

用以存储ANCM配置信息的Web.config文件位于应用的根目录文件夹。该文件中的配置信息表示你的应用程序的启动命令和参数。有关配置选项的示例Web.config代码和指南,请参考​​ASP.NET Core 模块配置参考​​。

在开发中借助IIS Express运行应用

通过使用ASP.NET Core模板定义的默认配置文件,Visual Studio可以启动IIS Express服务。

下一步

更多的详细信息,请参考以下资源:

龙腾一族至尊龙骑