最小托管模型:退出 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();
当它以退出代码 0
从 Program.Main()
退出时,这告诉您您的 Program
运行 是正确的——因此,会看到您的配置代码的日志记录— 但随后它在没有真正启动您的 Web 应用程序的情况下停止了。
一旦知道要查找它,就可以轻松修复。
将 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();
当它以退出代码 0
从 Program.Main()
退出时,这告诉您您的 Program
运行 是正确的——因此,会看到您的配置代码的日志记录— 但随后它在没有真正启动您的 Web 应用程序的情况下停止了。
一旦知道要查找它,就可以轻松修复。