-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Open
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-minimalIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcfeature-minimal-actionsController-like actions for endpoint routingController-like actions for endpoint routinghelp candidateIndicates that the issues may be a good fit for community to help with. Requires work from eng. teamIndicates that the issues may be a good fit for community to help with. Requires work from eng. team
Milestone
Description
Background and Motivation
There are scenarios where APIs want to work directly on the response stream without buffering. Today the Stream overloads assume you have a stream that you have produced that is then copied to the underlying response stream, instead, we want to provide a result type that gives you access to the underlying response stream.
Example:
https://github.com/khalidabuhakmeh/dotnet-dramameter/blob/main/DramaMeter/Program.cs#L37-L43
Another is writing a blob storage results to the http response.
Proposed API
namespace Microsoft.AspNetCore.Http
{
public static class Results
{
+ public IResult Stream(Func<Stream, Task> streamWriterCallback,
+ string? contentType = null,
+ string? fileDownloadName = null,
+ DateTimeOffset? lastModified = null,
+ EntityTagHeaderValue? entityTag = null,
+ bool enableRangeProcessing = false);
}
}Usage Examples
app.MapGet("/", async (HttpContext http, string? level) => {
level ??= "low";
if (!levels.TryGetValue(level.Trim(), out var result))
return Results.BadRequest("invalid level");
var image = background.CloneAs<Rgba32>();
image.Mutate(ctx => {
ctx.Vignette(result.color); // match the background to the intensity
ctx.DrawImage(foreground, new Point(0, 0), 1f);
ctx.DrawImage(result.image, new Point(0, 0), opacity: 1f);
});
http.Response.Headers.CacheControl = $"public,max-age={FromHours(24).TotalSeconds}";
return Results.Stream(stream => image.SaveAsync(stream, PngFormat.Instance), "image/png");
});Risks
None
slang25 and SwimburgerAhmedAbuelnour and Swimburger
Metadata
Metadata
Assignees
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-minimalIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcfeature-minimal-actionsController-like actions for endpoint routingController-like actions for endpoint routinghelp candidateIndicates that the issues may be a good fit for community to help with. Requires work from eng. teamIndicates that the issues may be a good fit for community to help with. Requires work from eng. team