Skip to content

Instantly share code, notes, and snippets.

@DamianEdwards
Last active March 6, 2022 04:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DamianEdwards/cd6ab8865e9a0804c40f5a56d91c63af to your computer and use it in GitHub Desktop.
Save DamianEdwards/cd6ab8865e9a0804c40f5a56d91c63af to your computer and use it in GitHub Desktop.
Endpoint Groups
app.MapGroup("/apis", apis =>
{
apis.UseExceptionHandler("/error");
var problemJsonMediaType = new MediaTypeHeaderValue("application/problem+json");
apis.MapGet("/error", (HttpContext context) =>
{
// Get exception details
var error = context.Features.Get<IExceptionHandlerFeature>()?.Error;
var badRequestEx = error as BadHttpRequestException;
var statusCode = badRequestEx?.StatusCode ?? StatusCodes.Status500InternalServerError;
// Return JSON if client supports it
if (context.Request.GetTypedHeaders().Accept?.Any(h => problemJsonMediaType.IsSubsetOf(h)) == true)
{
var extensions = new Dictionary<string, object> { { "requestId", Activity.Current?.Id ?? context.TraceIdentifier } };
// JSON Problem Details
return error switch
{
BadHttpRequestException ex => Results.Extensions.Problem(detail: ex.Message, statusCode: ex.StatusCode, extensions: extensions),
_ => Results.Extensions.Problem(extensions: extensions)
};
}
// Just return plain text
return Results.Extensions.StatusCode(statusCode, badRequestEx?.Message ?? "An unhandled exception occurred while processing the request.");
})
.ExcludeFromDescription();
apis.MapGroup("/samples", sampleApis =>
{
sampleApis.UseMiddleware<MyMiddleware>();
sampleApis.MapGet("/hello", () => "Hello, World!");
})
.WithTags("Samples");
apis.MapGroup("/todos", todoApis =>
{
todoApis.MapGet(async (TodoDb db) =>
{
return await db.Todos.ToListAsync();
});
todoApis.MapGet("{id}", async (int id, TodoDb db) =>
{
return await db.Todos.FindAsync(id);
});
todoApis.MapPost(async (Todo todo, TodoDb db) =>
{
db.Todos.Add(todo);
await db.SaveChangesAsync();
return Results.Created($"{todoApis.GroupPrefix}/{todo.Id}", todo);
});
})
.WithTags("Todos");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment