tomRedox
tomRedox

Reputation: 30453

How to turn on CircuitOptions.DetailedErrors?

I'm getting this message in the console when running a server-side Blazor app:

Error: There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on detailed exceptions in 'CircuitOptions.DetailedErrors'

I've had a look at the Blazor error handling documentation, but I can't work out how to actually turn on the detailed errors mentioned in that message?

Upvotes: 75

Views: 69616

Answers (5)

Tyson Gibby
Tyson Gibby

Reputation: 4660

NO CODE : EASIER & More SECURE

Best Practice

This is easier than most of the proposed solutions and it does not introduce a possible security issue into the code. It is also considered a coding best practice.

Microsoft recommends adding the following to the appsettings.development.json file as it does not add code to the application that can become a security risk. It is not recommended to put this in appsettings.json as that settings file is reserved for the production environment.

You can also use this approach to provide detailed error logging for SignalR.

src: Handle errors in ASP.NET Core Blazor apps: Detailed circuit errors

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

Upvotes: 84

tomRedox
tomRedox

Reputation: 30453

More digging on this revealed that there are both non-Blazor specific .NET Core ways to turn on Detailed Errors, and also a Blazor specific approach:

The modern approach

The methods I detail below date from the .NET 2.1 era and things have improved a lot since then. Tyson Gibby's answer is a better way to handle this in general now, so I've changed that to the accepted answer.

I've left the two approaches below for historic reference anyone needing answers for earlier versions of Blazor.

[Outdated] The general .NET Core way to turn on Detailed Errors:

There are a number of ways to get the detailed errors as discussed in the .NET Core documentation, but I ended up using the Detailed Errors setting:

WebHost.CreateDefaultBuilder(args).UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

And the Development Environment setting:

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

Both of those are used in Program.cs:

If you are using the older (and eventually to be deprecated IWebHostBuilder approach) that looks like this:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")
        //.UseEnvironment(EnvironmentName.Development)
        .UseStartup<Startup>();

And if you're using the newer IHostBuilder approach that was introduced with Core 2.1 that looks like this:

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

Once I set that I got more details about my misfiring Blazor code.

[Outdated] A Blazor specific approach:

An alternative approach for turning on detailed errors can also be found in this answer, which includes this code:

services.AddServerSideBlazor().AddCircuitOptions(options => {  options.DetailedErrors = true; });

This approach can then be expanded to include a check for whether the code is being run in the development environment

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

as highlighted by @Eonasdan's answer below

Upvotes: 76

John81
John81

Reputation: 4074

For .NET Core 6 you can use WebApplicationBuilder.

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

Upvotes: 5

Eonasdan
Eonasdan

Reputation: 7765

A better way to add detailed errors is to check your environment first. In Startup.cs add IWebHostEnvironment env to your constructor.

Then you can do this:

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

Upvotes: 20

Alvaro Rivoir
Alvaro Rivoir

Reputation: 401

For me it was slightly different

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

Upvotes: 3

Related Questions