[Blazor] - 关于 "HTTP Error 500.38 - ANCM Application DLL Not Found" 的调整及相关资料

须知少年凌云志,曾许人间第一流。这篇文章主要讲述[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 的错误

[Blazor] - 关于 "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
[Blazor] - 关于 "HTTP Error 500.38 - ANCM Application DLL Not Found" 的调整及相关资料

文章图片

什么是ANCM?
ANCM = ASP.NET Core Module
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-3.1
【[Blazor] - 关于 " HTTP Error 500.38 - ANCM Application DLL Not Found" 的调整及相关资料】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
[Blazor] - 关于 "HTTP Error 500.38 - ANCM Application DLL Not Found" 的调整及相关资料

文章图片

进程内托管
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。

    推荐阅读