iis - ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败
问题描述
我刚刚将我的 Web 应用程序从 ASP.NET (Framework) MVC 升级到了 ASP.NET Core 2.2。该应用程序在 IIS Express 下运行良好,但是一旦我尝试在 IIS 下运行它,它就会给出一般错误:
HTTP 错误 500.0 - ANCM 进程内处理程序加载失败 此问题的常见原因:未找到 Microsoft.NetCore.App 或 Microsoft.AspNetCore.App 的指定版本。进程中的请求处理程序 Microsoft.AspNetCore.Server.IIS 未在应用程序中引用。ANCM 找不到 dotnet。
我在网上搜索过,发现很多开发人员都遇到了同样的问题,看来微软真的错过了这一点,并且尽可能地让在 IIS 下开发 ASP.NET Core 应用程序变得痛苦。无论如何,我想打破过去 24 小时一直撞到头的这堵砖墙,所以需要一些帮助。
到目前为止我尝试过的事情:
安装了最新版本的 .NET Core Runtime and Hosting Bundle,版本 2.2.4。
安装了最新版本的 .NET Core SDK,版本 2.2.203。
确保“dotnet”可以从命令行运行,并且 x64 版本在我的环境变量中的 x86 版本之前。
C:\WINDOWS\system32>其中 dotnet C:\Program Files\dotnet\dotnet.exe C:\Program Files (x86)\dotnet\dotnet.exe
尝试将我的自动生成的 Web.config 从 aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" 更改为 aspNetCore processPath="dotnet" arguments="./Housters.Web.dll" 但是更改没有坚持,每次我构建我的 Web 应用程序时,Web.config 都会恢复到原来的 %LAUNCHER_PATH% 值。
尝试在 Web.config 中将“AspNetCoreModuleV2”更改为“AspNetCoreModule”。
将 IsTransformWebConfigDisabled=true 添加到我的 Web.csproj 文件中,以防止我的自定义 Web.config 被覆盖。它不起作用,Web.config 仍然被覆盖。
尝试在我的 Web.csproj 文件中将 AspNetCoreHostingModel=InProcess 切换为 RuntimeFrameworkName=Microsoft.AspNetCore.App 。
清理解决方案,以及手动删除 bin、obj 甚至 .vs 文件夹。
这些方法都没有帮助,我仍然得到相同的 ANCM In-Process Handler Load Failure 错误。事件查看器确实显示了一个更有用的错误:
应用程序 'C:\Housters\Web\' 无法启动。在“C:\Housters\Web\%LAUNCHER_PATH%.exe”中找不到可执行文件
但是,我对此无能为力,因为我的 Web.config 更改不会持续存在。但实际上,默认设置应该是开箱即用的,我们不应该为了让 IIS 开发工作而费尽心思。为什么 ASP.NET Core 项目默认只生成 .dll 时要查找 .exe?为什么不将 %LAUNCHER_PATH% 替换为正确的路径,例如“bin/Debug”?
编辑:我还应该提到,有时我能够让我的自定义 Web.config 持久化,当我这样做时,每次尝试运行 Web 应用程序时,我都会得到一个 JIT 调试器提示:
选择调试或查看事件日志只会给我一个非常不友好的错误消息:
错误应用程序名称:w3wp.exe,版本:10.0.17134.1,时间戳:0xed729d4e 错误模块名称:KERNELBASE.dll,版本:10.0.17134.556,时间戳:0xb9f4a0f1 异常代码:0xc0020001 错误偏移:0x000000000003a3850 错误进程应用程序启动时间:0x01d502b1f21b112e 错误应用程序路径:c:\windows\system32\inetsrv\w3wp.exe 错误模块路径:C:\WINDOWS\System32\KERNELBASE.dll 报告 ID:5b5c14cb-8ffa-47b4-8cc1-42f951bc1256 错误包已满名称:错误包相关的应用程序 ID:
解决方案
您收到此错误是因为您没有指定是否要在进程中或进程外托管网站...可以使用 UseIIS() 指定进程中。
尝试将 Program.cs 中的 CreateWebHostBuilder 方法更改为:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = WebHost.CreateDefaultBuilder(args);
if (env == EnvironmentName.Staging || env == EnvironmentName.Production)
builder.UseIIS();
builder.UseStartup<Startup>();
return builder;
}
我通过添加以下内容在我的 .pubxml 部署配置文件中设置 ASPNETCORE_ENVIRONMENT:
<PropertyGroup>
<EnvironmentName>Staging</EnvironmentName>
</PropertyGroup>
推荐阅读
- android - 是否可以在使用 BottomNavigationView 时保持所有片段处于运行状态,即使是那些在屏幕上不可见的片段?
- java - 对于每个嵌套的每个
- javascript - 如何循环浏览复杂对象的元素并将其显示在表格中
- rest - 仅在春季数据休息中为子资源级别启用存储库?
- python - 从数据框中的字符串中删除字符
- javascript - TypeError: this.props.* 不是函数(即使有绑定)
- c# - 为参与者“{actorName}”获取基于回合的并发锁在 {time} 后超时
- regex - 带有字母、数字、任意顺序的可选特殊字符的正则表达式单词
- vba - (VBA)如何将数据从一张表移动到另一张表,向下和跨行移动以提取数据
- sql-server - 使用 SELECT 语句的 BCrypt 散列