• [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。

  • 相关阅读:
    Python六大开源框架对比:Web2py略胜一筹
    软件设计之UML—UML的构成[上]
    Web程序员最常用的11款PHP框架
    PHP常见框架
    WinCE的开发流程
    Windows10如何卸载OneDrive
    Windows系统中环境变量不展开的问题
    线程局部存储空间
    ping pathping tcping psping tracert
    ubuntu ufw 配置
  • 原文地址:https://www.cnblogs.com/jinzesudawei/p/12851887.html
Copyright © 2020-2023  润新知