Skip to content

Response Types

HandleAsync returns Task<TResult>. The value of TResult determines how the response is written:

ScenarioReturn typeExample
JSON responseResponse<TBody>return new Response<UserResponse> { Body = user }
JSON with status code or headersResponse<TBody>return new Response<UserResponse> { StatusCode = HttpStatusCode.Created, Body = user }
No response bodyResponse<EmptyResponse>return Response.NoContent
Multiple response shapesIResultreturn Results.Problem(...) or Results.Json(...)
CSV export or other streamIResult implementationreturn Task.FromResult(CsvResponse.From(rows))
Fully custom responseAny IResult implementationreturn Task.FromResult(new MyCustomResult(...))

Response<TBody> has three properties. Only Body is required:

new Response<UserResponse>
{
StatusCode = HttpStatusCode.Created, // defaults to 200 OK
Headers = [("Location", $"/users/{id}")], // defaults to empty
Body = new UserResponse { Id = id }, // required
}

The static shorthands Response.Empty (200 OK, no body) and Response.NoContent (204 No Content) cover the most common no-body cases.

For more details on declaring error response shapes in OpenAPI, see the Error Responses guide.