Problem.Details 1.1.0

dotnet add package Problem.Details --version 1.1.0
                    
NuGet\Install-Package Problem.Details -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Problem.Details" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Problem.Details" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Problem.Details" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Problem.Details --version 1.1.0
                    
#r "nuget: Problem.Details, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=Problem.Details&version=1.1.0
                    
Install Problem.Details as a Cake Addin
#tool nuget:?package=Problem.Details&version=1.1.0
                    
Install Problem.Details as a Cake Tool

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

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
.NET Core netcoreapp3.1 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.1

    • No dependencies.
  • net5.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.0 4,606 9/2/2021

Initial release