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.
All response codes above 400
will have a nice JSON response, for example:
{
"type": "https://httpstatuses.com/404",
"title": "Error: Not Found",
"status": 404
}
{
"errors": {
"requiredField": ["The requiredField field is required."]
},
"type": "https://httpstatuses.com/400",
"title": "Error: Bad Request",
"status": 400
}
{
"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.
- Install the package
Install-Package Problem.Details
Or via the .NET Core command line interface:
dotnet add package Problem.Details
- Call
services.AddProblemDetails()
in services configure method:
public void ConfigureServices(IServiceCollection services)
{
services.AddProblemDetails();
- 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