[Blazor] - 關於 "HTTP Error 500.38 - ANCM Application DLL Not Found" 的調整及相關資料


背景

發布並部署一個 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 擴展。

https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-aspnetcore-3.1.3-windows-hosting-bundle-installer

進程內托管
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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM