Class HttpResponseExtensions
The single Trellis verb for converting Result<TValue> /
WriteOutcome<T> / Page<T> values to ASP.NET Core HTTP responses. Works
in both Minimal API endpoints and MVC controllers (.NET 7+ executes
IResult natively in MVC). For typed
ActionResult<T> signatures, chain
AsActionResult<T>(IResult).
public static class HttpResponseExtensions
- Inheritance
-
HttpResponseExtensions
- Inherited Members
Remarks
Configure protocol semantics via the optional fluent HttpResponseOptionsBuilder<TDomain>:
WithETag, WithLastModified, Vary, CreatedAtRoute,
EvaluatePreconditions, HonorPrefer, etc. All selectors run against the domain value;
the response body may be projected separately via the body overload.
No-payload success: Result<Unit> is rendered as 204 No Content
(with HonorPrefer/Vary/ETag headers still applied).
Methods
ToHttpResponse(Error, Action<HttpResponseOptionsBuilder>?)
Maps a standalone Error to a Problem Details HTTP response. Useful for endpoints that produce a deterministic error without a Result<TValue> pipeline (e.g. diagnostic / fault demonstration endpoints).
public static IResult ToHttpResponse(this Error error, Action<HttpResponseOptionsBuilder>? configure = null)
Parameters
errorErrorconfigureAction<HttpResponseOptionsBuilder>
Returns
ToHttpResponseAsync<T>(Task<Result<WriteOutcome<T>>>, Action<HttpResponseOptionsBuilder<T>>?)
Async Task overload.
public static Task<IResult> ToHttpResponseAsync<T>(this Task<Result<WriteOutcome<T>>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultTaskTask<Result<WriteOutcome<T>>>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponseAsync<T>(Task<Result<T>>, Action<HttpResponseOptionsBuilder<T>>?)
Async Task overload.
public static Task<IResult> ToHttpResponseAsync<T>(this Task<Result<T>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultTaskTask<Result<T>>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponseAsync<T>(ValueTask<Result<WriteOutcome<T>>>, Action<HttpResponseOptionsBuilder<T>>?)
Async ValueTask overload.
public static ValueTask<IResult> ToHttpResponseAsync<T>(this ValueTask<Result<WriteOutcome<T>>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultTaskValueTask<Result<WriteOutcome<T>>>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponseAsync<T>(ValueTask<Result<T>>, Action<HttpResponseOptionsBuilder<T>>?)
Async ValueTask overload.
public static ValueTask<IResult> ToHttpResponseAsync<T>(this ValueTask<Result<T>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultTaskValueTask<Result<T>>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponseAsync<T, TBody>(Task<Result<Page<T>>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Async Task overload.
public static Task<IResult> ToHttpResponseAsync<T, TBody>(this Task<Result<Page<T>>> resultTask, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultTaskTask<Result<Page<T>>>nextUrlBuilderFunc<Cursor, int, string>bodyFunc<T, TBody>configureAction<HttpResponseOptionsBuilder<Page<T>>>
Returns
Type Parameters
TTBody
ToHttpResponseAsync<TDomain, TBody>(Task<Result<WriteOutcome<TDomain>>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Async Task overload with body projection.
public static Task<IResult> ToHttpResponseAsync<TDomain, TBody>(this Task<Result<WriteOutcome<TDomain>>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultTaskTask<Result<WriteOutcome<TDomain>>>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody
ToHttpResponseAsync<TDomain, TBody>(Task<Result<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Async Task overload with body projection.
public static Task<IResult> ToHttpResponseAsync<TDomain, TBody>(this Task<Result<TDomain>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultTaskTask<Result<TDomain>>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody
ToHttpResponseAsync<T, TBody>(ValueTask<Result<Page<T>>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Async ValueTask overload.
public static ValueTask<IResult> ToHttpResponseAsync<T, TBody>(this ValueTask<Result<Page<T>>> resultTask, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultTaskValueTask<Result<Page<T>>>nextUrlBuilderFunc<Cursor, int, string>bodyFunc<T, TBody>configureAction<HttpResponseOptionsBuilder<Page<T>>>
Returns
Type Parameters
TTBody
ToHttpResponseAsync<TDomain, TBody>(ValueTask<Result<WriteOutcome<TDomain>>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Async ValueTask overload with body projection.
public static ValueTask<IResult> ToHttpResponseAsync<TDomain, TBody>(this ValueTask<Result<WriteOutcome<TDomain>>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultTaskValueTask<Result<WriteOutcome<TDomain>>>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody
ToHttpResponseAsync<TDomain, TBody>(ValueTask<Result<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Async ValueTask overload with body projection.
public static ValueTask<IResult> ToHttpResponseAsync<TDomain, TBody>(this ValueTask<Result<TDomain>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultTaskValueTask<Result<TDomain>>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody
ToHttpResponse<T>(Result<WriteOutcome<T>>, Action<HttpResponseOptionsBuilder<T>>?)
Maps a Result<TValue> of WriteOutcome<T> to an HTTP response with
status driven by the outcome variant per RFC 9110:
Created -> 201 + Location, Updated -> 200 (or 204 with Prefer: return=minimal),
UpdatedNoContent -> 204, Accepted -> 202.
public static IResult ToHttpResponse<T>(this Result<WriteOutcome<T>> result, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultResult<WriteOutcome<T>>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponse<T>(Result<T>, Action<HttpResponseOptionsBuilder<T>>?)
Maps a Result<TValue> to a 200 OK (success, body = T) or
Problem Details (failure). When configured via
Created(string) or
CreatedAtRoute(string, Func<TDomain, RouteValueDictionary>), returns 201 Created with a
Location header.
public static IResult ToHttpResponse<T>(this Result<T> result, Action<HttpResponseOptionsBuilder<T>>? configure = null)
Parameters
resultResult<T>configureAction<HttpResponseOptionsBuilder<T>>
Returns
Type Parameters
T
ToHttpResponse<T, TBody>(Result<Page<T>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Maps a Result<TValue> of Page<T> to an HTTP response with the
paginated envelope and an RFC 8288 Link header. Delegates to the existing paginated
helper (which carries the RFC 8288 logic) and feeds the failure path through the unified
error mapping.
public static IResult ToHttpResponse<T, TBody>(this Result<Page<T>> result, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultResult<Page<T>>nextUrlBuilderFunc<Cursor, int, string>bodyFunc<T, TBody>configureAction<HttpResponseOptionsBuilder<Page<T>>>
Returns
Type Parameters
TTBody
ToHttpResponse<TDomain, TBody>(Result<WriteOutcome<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Maps a Result<TValue> of WriteOutcome<T> with body projection.
public static IResult ToHttpResponse<TDomain, TBody>(this Result<WriteOutcome<TDomain>> result, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultResult<WriteOutcome<TDomain>>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody
ToHttpResponse<TDomain, TBody>(Result<TDomain>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)
Maps a Result<TValue> to an HTTP response, projecting the body via
body. Selectors in the options builder still run against the domain value.
public static IResult ToHttpResponse<TDomain, TBody>(this Result<TDomain> result, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)
Parameters
resultResult<TDomain>bodyFunc<TDomain, TBody>configureAction<HttpResponseOptionsBuilder<TDomain>>
Returns
Type Parameters
TDomainTBody