Table of Contents

Class HttpResponseExtensions

Namespace
Trellis.Asp
Assembly
Trellis.Asp.dll

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

error Error
configure Action<HttpResponseOptionsBuilder>

Returns

IResult

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

resultTask Task<Result<WriteOutcome<T>>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

Task<IResult>

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

resultTask Task<Result<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

Task<IResult>

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

resultTask ValueTask<Result<WriteOutcome<T>>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

ValueTask<IResult>

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

resultTask ValueTask<Result<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

ValueTask<IResult>

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

resultTask Task<Result<Page<T>>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

Task<IResult>

Type Parameters

T
TBody

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

resultTask Task<Result<WriteOutcome<TDomain>>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

Task<IResult>

Type Parameters

TDomain
TBody

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

resultTask Task<Result<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

Task<IResult>

Type Parameters

TDomain
TBody

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

resultTask ValueTask<Result<Page<T>>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

ValueTask<IResult>

Type Parameters

T
TBody

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

resultTask ValueTask<Result<WriteOutcome<TDomain>>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

ValueTask<IResult>

Type Parameters

TDomain
TBody

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

resultTask ValueTask<Result<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

ValueTask<IResult>

Type Parameters

TDomain
TBody

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

result Result<WriteOutcome<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

IResult

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

result Result<T>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

IResult

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

result Result<Page<T>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

IResult

Type Parameters

T
TBody

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

result Result<WriteOutcome<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

IResult

Type Parameters

TDomain
TBody

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

result Result<TDomain>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

IResult

Type Parameters

TDomain
TBody