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<T, TBody>(Task<Result<Page<T>>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Async Task overload with direction-aware pagination URLs.
public static Task<IResult> ToHttpResponseAsync<T, TBody>(this Task<Result<Page<T>>> resultTask, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultTaskTask<Result<Page<T>>>urlBuilderFunc<Cursor, PageDirection, 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<T, TBody>(ValueTask<Result<Page<T>>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Async ValueTask overload with direction-aware pagination URLs.
public static ValueTask<IResult> ToHttpResponseAsync<T, TBody>(this ValueTask<Result<Page<T>>> resultTask, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultTaskValueTask<Result<Page<T>>>urlBuilderFunc<Cursor, PageDirection, 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. Uses the same
nextUrlBuilder for both next and previous cursors.
Use the direction-aware overload when the links require different query parameters.
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<T, TBody>(Result<Page<T>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)
Maps a Result<TValue> of Page<T> to a paginated envelope
and matching RFC 8288 Link header using direction-aware URLs.
public static IResult ToHttpResponse<T, TBody>(this Result<Page<T>> result, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)
Parameters
resultResult<Page<T>>The page result to map.
urlBuilderFunc<Cursor, PageDirection, int, string>Builds an absolute URL from the cursor, link direction, and applied limit.
bodyFunc<T, TBody>Projects each domain item to the response body.
configureAction<HttpResponseOptionsBuilder<Page<T>>>Optional response configuration.
Returns
- IResult
The paginated response, or the mapped error response on failure.
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