Skip to content

Latest commit

 

History

History
84 lines (68 loc) · 3.23 KB

File metadata and controls

84 lines (68 loc) · 3.23 KB

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