如何开启CircuitOptions.DetailedErrors?

62
我在运行服务器端的 Blazor 应用程序时,控制台出现了以下消息:

错误:当前电路上发生了未处理的异常,因此该电路将被终止。 要获取更多详细信息,请在“CircuitOptions.DetailedErrors”中打开详细异常

我查看了Blazor 错误处理文档,但我无法弄清楚如何实际打开该消息中提到的详细错误?
5个回答

75
更深入的挖掘发现,有非Blazor特定的.NET Core方法可以打开详细错误,也有Blazor特定的方法:
现代方法
下面我详细介绍的方法是从.NET 2.1时代开始的,事情从那时起已经有了很大的改进。Tyson Gibby的答案现在是一种更好的处理方法,所以我已经将其更改为被接受的答案。
我保留了下面的两种方法,供那些需要早期版本Blazor答案的人参考。
[过时]打开详细错误的一般.NET Core方法:
有很多种方法可以获取详细错误,如.NET Core文档中所讨论的,但我最终使用了详细错误设置
WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

还有开发环境设置

WebHost.CreateDefaultBuilder(args).UseEnvironment(Environments.Development)

这两个都在Program.cs中使用:
如果你正在使用旧的(并最终将被弃用 IWebHostBuilder方法),它看起来像这样:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")
        //.UseEnvironment(EnvironmentName.Development)
        .UseStartup<Startup>();

如果你正在使用较新的 IHostBuilder 方法,这是在 Core 2.1 中引入的,它看起来像这样:
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder
                .UseStartup<Startup>()
                .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")
                //.UseEnvironment(EnvironmentName.Development);
        });

我一旦设置好了,就对我那个出错的 Blazor 代码有了更多的细节了。

[已过时] 一个特定于 Blazor 的方法:

打开详细错误信息的另一种方法 也可以在这个答案中找到,其中包括以下代码:

services.AddServerSideBlazor().AddCircuitOptions(options => {  options.DetailedErrors = true; });
这种方法可以进一步扩展,以包括检查代码是否在开发环境中运行。
services.AddServerSideBlazor().AddCircuitOptions(o =>
{
    //only add details when debugging
    o.DetailedErrors = _env.IsDevelopment();
});
如下所示:

由 @Eonasdan 的回答突出显示的部分


1
EnvironmentName.Development - Simon Foster
糟糕,我发帖太快了。我本来想说,VS建议使用Environments.Development而不是标记为过时的EnvironmentName.Development。 - Simon Foster
1
这非常有用。另一种方法也可以是只需#if DEBUG附加行,以便在发布构建中禁用增强错误。 - Webreaper
1
如何在ConfigureServices方法中获取_env(一个IWebHostEnvironment)? - hybrid2102
IHostBuilder 没有 .UseSetting 方法。 - BrainSlugs83
显示剩余9条评论

39

无代码:更简单和更安全

最佳实践

这比大多数提出的解决方案更简单,并且不会在代码中引入可能的安全问题。它也被认为是编码的最佳实践。

微软建议将以下内容添加到appsettings.development.json文件中,因为它不会向应用程序添加可能成为安全风险的代码。不建议将此设置放在appsettings.json中,因为该设置文件保留给生产环境使用。

您还可以使用此方法为SignalR提供详细的错误日志记录。

来源:在ASP.NET Core Blazor应用程序中处理错误:详细的电路错误

{
  "DetailedErrors": true, // turns on CircuitOptions.DetailedErrors
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.AspNetCore.SignalR": "Debug"  // turns on SignalR debugging
    }
  }
}

3
这应该是被接受的答案。 - Greg Gum
1
这是一个系统化的解决方案。我会按照这个方式去做。 - Honza P.
@Kissaki 如果你在代码中添加调试功能,那么它将在所有环境中生效,而不仅仅是在开发环境中。这就打开了任何人都能够查看你的调试信息并收集关于你的应用程序的信息的可能性,这可能会导致他们利用你的代码。你可以添加额外的代码,只有在开发环境中运行调试代码,但这可能会变得复杂和难以维护,再次提供了潜在的漏洞可能性。 - undefined
“而且它不会在代码中引入可能的安全问题”这句话意味着它本质上比较安全,而不仅仅是减少错误的可能性。 - undefined
它的安全性较低,容易出错。 - undefined
显示剩余2条评论

20

一种更好的添加详细错误信息的方法是先检查您的环境。在Startup.cs中将IWebHostEnvironment env添加到构造函数中。

然后您可以这样做:

services.AddServerSideBlazor().AddCircuitOptions(o =>
{
    if (_env.IsDevelopment()) //only add details when debugging
    {
        o.DetailedErrors = true;
    }
});

这是一个非常好的观点,从安全角度来看也非常重要。我已经相应地更新了我的答案。 - tomRedox

4

对于.NET Core 6,您可以使用WebApplicationBuilder。

var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
    builder.Services.AddServerSideBlazor().AddCircuitOptions(x => x.DetailedErrors = true);
}
else
{
    builder.Services.AddServerSideBlazor();
}

这似乎是与这个答案相同的解决方案? - undefined

3

对我来说稍微有点不同

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseSetting(WebHostDefaults.DetailedErrorsKey, "true");
            webBuilder.UseStartup<Startup>();
        });

与什么不同?这是否也使Blazor使用详细的错误报告,还是只有asp.net? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接