最小托管模型:退出 Program.Main,退出代码 =“0”

Minimal Hosting Model: Exited from Program.Main with exit code = '0'

将 ASP.NET Core 6 应用程序从遗留 Program/Startup 迁移到使用 new minimal hosting model 后,我收到了一组无法描述的错误。

错误信息

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

HTTP Error 500.30 - ASP.NET Core app failed to start

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

Application '/LM/W3SVC/2/ROOT' with physical root 'C:\Code' has exited from Program.Main with exit code = '0'. Please check the stderr logs for more information.

紧随其后的是事件 1007:

Application '/LM/W3SVC/2/ROOT' with physical root 'C:\Code' failed to load coreclr.

Exception message: CLR worker thread exited prematurely

当 运行 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();

以前的话题

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

问题

此问题是否有常见原因?或者,还有其他方法可以调试这种情况吗?

错误消息不是很直观,但这个错误本质上意味着应用程序 运行,然后立即退出。出现这种情况的一个常见原因是您忘记在 Program:

末尾添加 Run() 命令
app.Run();

背景

如果您专注于从 Startup class 迁移 ConfigureServices()Configure() 方法,这很容易被忽略。虽然您之前的大部分配置代码可能都位于 class 中,但 Run() 方法是需要从遗留 Program class 迁移的少数部分之一。您可能会从您的遗留 Main() 方法中认出它;例如,

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

在新的 ASP.NET Core 6 最小托管模型中,这得到 t运行预定为:

var builder = WebApplication.CreateBuilder(args);

// Configuration from Startup.ConfigureService()

var app = builder.Build();

// Configuration from Startup.Configure()

app.Run();

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

一旦知道要查找它,就可以轻松修复。