After migrating an ASP.NET Core 6 app from the legacy Program
/Startup
to use the new minimal hosting model, I am receiving a non-descript set of errors.
Error Messages
I have explicitly enabled UseDeveloperExceptionPage()
to be safe, but all I am receiving in the browser is the generic:
HTTP Error 500.30 - ASP.NET Core app failed to start
In the Event Viewer, Event 1011 gets logged:
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.
Followed by Event 1007:
Application '/LM/W3SVC/2/ROOT' with physical root 'C:\Code' failed to load coreclr.
Exception message: CLR worker thread exited prematurely
No further information is available in the debug console when running either IIS Express or Kestrel. I am, however, able to see other startup processes from my Program
being logged, so know they're loading correctly.
Code
This is a simplified version of my Program
file, with custom components removed:
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();
Previous Threads
As these are really general errors, there are quite a few previous threads available related to this issue—but none that seem applicable to this case. (Many have to do with the ASP.NET Core Hosting Bundle, which I am not using.)
Question
Are there common causes for this issue? Alternatively, are there other approaches for debugging this scenario?
The error messages aren't terribly intuitive, but this error essentially means that the application ran, and then immediately exited. A common cause of this is when you neglect to add the
Run()
command at the end of theProgram
:Background
This is easy to miss if you're focused on migrating your
ConfigureServices()
andConfigure()
methods from yourStartup
class. While most of your previous configuration code likely lives in that class, theRun()
method is one of a few pieces that needs to be migrated from your legacyProgram
class. You might recognize it from your legacyMain()
method; e.g.,In the new ASP.NET Core 6 minimal hosting model, this gets translated to:
When it exits from
Program.Main()
with exit code0
, that's telling you that yourProgram
ran correctly—and, thus, seeing logging for your configuration code—but then it stopped without ever actually launching your web application.Simple fix once you know to look for it.