-2

从旧版Program/迁移 ASP.NET Core 6 应用程序Startup以使用新的最小托管模型后,我收到一组无法描述的错误。

错误信息

我已明确启用UseDeveloperExceptionPage()安全,但我在浏览器中收到的只是通用的:

HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

在事件查看器中,事件 1011 被记录:

物理根目录为“C:\Code”的应用程序“/LM/W3SVC/2/ROOT”已从 Program.Main 退出,退出代码为“0”。请检查 stderr 日志以获取更多信息。

随后是事件 1007:

具有物理根目录“C:\Code”的应用程序“/LM/W3SVC/2/ROOT”无法加载 coreclr。

异常消息:CLR 工作线程过早退出

运行 IIS Express 或 Kestrel 时,调试控制台中没有更多信息可用。但是,我能够从我Program的记录中看到其他启动过程,因此知道它们正在正确加载。

代码

这是我的Program文件的简化版本,删除了自定义组件:

using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.ViewComponents;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

// Should be implicit in Debug mode, but explicitly including to be safe
app.UseDeveloperExceptionPage();

app.UseStaticFiles();
app.UseRouting();

app.MapControllers();

以前的主题

由于这些确实是一般性错误,因此之前有很多与此问题相关的可用线程——但似乎没有一个适用于这种情况。(很多都与我没有使用的ASP.NET Core Hosting Bundle有关。)

问题

这个问题有常见的原因吗?或者,是否有其他方法可以调试此场景?

4

1 回答 1

0

错误消息不是很直观,但这个错误本质上意味着应用程序运行,然后立即退出。造成这种情况的一个常见原因是当您忽略Run()在末尾添加命令时Program

app.Run();

背景

如果您专注于从您的班级迁移您的ConfigureServices()Configure()方法,这很容易错过。Startup虽然您以前的大部分配置代码可能都存在于该类中,但该Run()方法是需要从您的遗留Program类迁移的少数部分之一。Main()您可能会从您的传统方法中认出它;例如,

public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();

在新的 ASP.NET Core 6 最小托管模型中,这被转换为:

var builder = WebApplication.CreateBuilder(args);

// Configuration from Startup.ConfigureService()

var app = builder.Build();

// Configuration from Startup.Configure()

app.Run();

当它Program.Main()以 exit code 退出时0,这表明您的Program运行正确——因此,可以看到配置代码的日志记录——但随后它在没有实际启动 Web 应用程序的情况下停止了。

一旦你知道要寻找它,就可以简单地修复它。

于 2021-12-11T21:08:53.773 回答