[Blazor]

背景

发布并部署一个 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。

原文地址:https://www.cnblogs.com/jinzesudawei/p/12851887.html