背景
發布並部署一個 Blazor Wasm 應用到 IIS
問題
發布時如果選擇了 Product single file,會得到 HTTP Error 500.38 - ANCM Application DLL Not Found 的錯誤

原因分析
HTTP Error 500.38 ANCM 找不到應用程序 DLL
https://docs.microsoft.com/zh-cn/aspnet/core/test/troubleshoot-azure-iis?view=aspnetcore-3.1#50038-ancm-application-dll-not-found
ANCM 找不到應用程序 ANCM,該內容應顯示在可執行文件的旁邊。
在使用進程內托管模型托管打包為單文件可執行程序的應用。該進程內模型要求 ANCM 將 .NET Core 應用加載到現有 IIS 進程中。
單文件部署模型不支持此方案。
調整方案
請在應用的項目文件中使用下述方法之一來修復此錯誤:
https://docs.microsoft.com/zh-cn/aspnet/core/test/troubleshoot-azure-iis?view=aspnetcore-3.1#50038-ancm-application-dll-not-found
- 通過將 PublishSingleFile MSBuild 屬性設置為 false 來禁用單文件發布。
- 通過將 AspNetCoreHostingModel MSBuild 屬性設置為 OutOfProcess 來切換到進程外托管模型。
或者
https://confluence.softwell.ru/display/KBNav/HTTP+Error+500.38+-+ANCM+Application+DLL+Not+Found
Option 1: In the web.config app file, remove hostingModel "inprocess" option
Option 2: Use the IIS app build

什么是ANCM?
ANCM = ASP.NET Core Module
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-3.1
ASP.NET Core 模塊是插入 IIS 管道的本機 IIS 模塊,用於:
- 在 IIS 工作進程 (
w3wp.exe) 內托管 ASP.NET Core 應用,稱為進程內托管模型。 - 將 Web 請求轉發到運行 Kestrel 服務器的后端 ASP.NET Core 應用,稱為進程外托管模型。
受支持的 Windows 版本:
- Windows 7 或更高版本
- Windows Server 2008 R2 或更高版本
在進程內托管時,該模塊會使用 IIS 進程內服務器實現,即 IIS HTTP 服務器 (IISHttpServer)。
在進程外托管時,該模塊僅適用於 Kestrel。
該模塊無法與 HTTP.sys 一起工作。
關於 .Net Core 進程內 (InProcess) 托管 和 進程外 (out-of-Process) 托管
https://www.cnblogs.com/51net/p/12765127.html
當一個 ASP.NET Core 應用程序執行的時候,.NET 運行時會去查找 Main()方法,因為它是這個應用程序的起點。
然后,Main()方法調用靜態類WebHost中的靜態方法CreateDefaultBuilder()用於配置和設置 Web 服務器。
ASP.NET Core 應用程序可以托管在進程內(InProcess)或進程外(OutOfProcess)中。
- 進程內(InProcess)托管
- 進程外(out-of-Process)托管
- 什么是 Kestrel
ASP.NET Core模塊概述
https://www.cnblogs.com/Wddpct/p/6123660.html
ASP.NET Core 模塊 (ANCM) 讓你能夠在 IIS 之后運行 ASP.NET Core 應用,IIS 和 Kestrel 各司其職,前者專於安全性,可管理性等方面,后者專於性能,我們從兩種技術中都能獲得益處。ANCM 只和 Kestrel 協同工作,它不兼容於 Weblistener。
ASP.NET Core的Kestrel服務器
https://www.cnblogs.com/Wddpct/p/6123653.html
Kestrel 是一個基於 libuv 的跨平台 ASP.NET Core web 服務器,libuv 是一個跨平台的異步 I/O 庫。
ASP.NET Core 模板項目使用 Kestrel 作為默認的 web 服務器。
Kestrel支持以下功能:
- HTTPS
- 用於啟用不透明升級的WebSockets
- 位於Nginx之后的高性能Unix sockets
Kestrel 被.NET Core支持的所有平台和版本所支持。
ASP.NET Core的幾種托管方式
https://juejin.im/post/5deda204518825125015e40a
Kestrel
Kestrel 是一個跨平台的適用於 ASP.NET Core 的 Web 服務器,默認包括在 ASP.NET Core 項目模板中。
IIS
在 IIS 中托管 ASP.NET Core 應用需要 ASP.NET Core 模塊。
安裝 .NET Core Windows Hosting Bundle 擴展。

進程內托管
ASP.NET Core 應用默認為進程內托管模型。在進程內托管時,使用 IIS HTTP 服務器 (IISHttpServer) 而不是 Kestrel 服務器。
進程外托管
進程外托管使用 Kestrel 服務器,而不是 IIS HTTP 服務器 (IISHttpServer)。
HTTP.sys
如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。 為了獲得最佳性能,通常建議使用 Kestrel。
HTTP.sys僅能在Windows上運行,且不能與ASP.NET Core模塊同時使用。在不想使用IIS或者需要使用Kestrel不具有的功能時可以使用HTTP.sys。
總結
綜上所述,Kestrel是一個跨平台的服務器,HTTP.sys則只能用於Windows中。
Kestrel與HTTP.sys都是嵌入在ASP.NET Core中的服務器,它們有點類似於SpringBoot中內嵌的Tomcat。
即使不使用額外的WEB服務器,例如IIS,Nginx,Apache等,項目最終生成的文件也可以直接運行,並提供HTTP服務。
不過,一般推薦的形式是,使用Kestrel作為應用服務器,使用常用的WEB服務器(Nginx,Apache等)作為反向代理。
在IIS中,官方提供了ASP.NET Core模塊,方便了將ASP.NET Core應用托管於IIS中,並提供了兩種模式,其工作方式也類似於反向代理。
在Windows中,對於某些Kestrel不支持的功能,則可以使用HTTP.sys。
