为什么异常页面在 IDE 的开发环境中不显示详细信息

Why the exception page doesn't show details in Development environment in IDE

我正在为非开发环境开发自定义错误页面。在处理此自定义页面时,我在 launchSettings.json 文件中将环境设置为“Staging”。当我将设置切换回“开发”并重新启动应用程序时,它只显示一般错误页面(参见下面的屏幕截图。)

我 运行 program.cs 中的跟踪并确实看到它正在使用默认的异常处理程序中间件:app.UseExceptionHandler("/Error");

我什至存在 IDE 并重新开始。但是详细的错误页面不再有效。 我无法弄清楚是什么原因导致的,也无法解决。请帮忙!(请参阅以下部分的更多详细信息)

测试信息:

应用类型:ASP .NET6 with razor pages

IDE: VS 2022

开发机:Windows11

使用 IIS Express 查看网页

launchSettings.json

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:16950",
      "sslPort": 44324
    }
  },
  "profiles": {
    "WebProtectConnString": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7074;http://localhost:5074",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "development"
      }
    }
  }
}

错误处理配置(在 program.cs 中)

if (app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
else
{
    app.UseExceptionHandler("/Exceptions/ErrorHandler");
}

默认情况下,在 .net 6 项目的 Program.cs 文件中,if (!app.Environment.IsDevelopment()) 是默认代码,但在您的代码片段中,它是 if (app.Environment.IsDevelopment()),这意味着当您设置DevelopmentlaunchSettings.json 中,您的应用程序将执行这 2 行

app.UseExceptionHandler("/Error");
app.UseHsts();

并且当执行 app.UseExceptionHandler("/Error"); 并出现未处理的异常时,Error.cshtml 将出现。这就是您在屏幕截图中看到该页面的原因。

由于您想为 non-development 环境使用自定义视图,您可能需要删除 app.UseExceptionHandler("/Error"); 并在下面编写代码,这将使您的应用程序在开发阶段直接显示异常消息并显示您在其他阶段的自定义视图:

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Exceptions/ErrorHandler");
    app.UseHsts();
}else{ //leave the else empty, then exception will show in browser directly  }