原文地址: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服務。
下一步
更多的詳細信息,請參考以下資源:
