Skip to content

ProblemDetails/Problem.Details

Repository files navigation

ProblemDetails

Build Quality Gate Status Coverage NuGet

Problem

By default, the ASP.NET MVC Core framework doesn't return consistent error responses across different statuses. For example, the framework will return a status 500 with an empty body when encountering an internal server error. Model validation errors will send back a JSON body, but the field names don't follow the casing rules. This package is meant to unify the responses.

Solution

All response codes above 400 will have a nice JSON response, for example:

Status 404 Not Found

{
  "type": "https://httpstatuses.com/404",
  "title": "Error: Not Found",
  "status": 404
}

Status 400 Bad Request (note that the field names are camel-cased)

{
  "errors": {
    "requiredField": ["The requiredField field is required."]
  },
  "type": "https://httpstatuses.com/400",
  "title": "Error: Bad Request",
  "status": 400
}

Status 500 Internal Server Error

{
  "type": "https://httpstatuses.com/500",
  "title": "Error: Internal Server Error",
  "status": 500,
  "exception": "System.Exception: Testing 500\n   at Sample.WebApi.Controllers.WeatherForecastController.Get(Int32 id) in /Users/hanneskarask/dev/Problem.Details/samples/Sample.WebApi/Controllers/WeatherForecastController.cs:line 42\n   at lambda_method3(Closure , Object , Object[] )..."
}

(exception is only visible when explicitly turned on, i.e. in dev environments)

You can also override the title values and map custom exceptions.

Getting started

  1. Install the package
Install-Package Problem.Details

Or via the .NET Core command line interface:

dotnet add package Problem.Details
  1. Call services.AddProblemDetails() in services configure method:
public void ConfigureServices(IServiceCollection services)
{
    services.AddProblemDetails();
  1. Call app.UseProblemDetails() in app Configure method:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseProblemDetails(configure => configure
        // Optional: Override title for Bad Request
        .MapStatusToTitle(HttpStatusCode.BadRequest, "One or more validation errors occurred")
        // Optional: Map your custom exception
        .MapException<NotFoundException>(HttpStatusCode.NotFound)
        // Optional: Show detailed error
        .ShowErrorDetails(env.IsDevelopment())
    );

Check the sample project or browse source