diff --git a/src/Http/Http.Results/src/Accepted.cs b/src/Http/Http.Results/src/Accepted.cs
new file mode 100644
index 000000000000..fed67811d4dc
--- /dev/null
+++ b/src/Http/Http.Results/src/Accepted.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with status code Accepted (202) and Location header.
+/// Targets a registered route.
+///
+public sealed class Accepted : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The location at which the status of requested content can be monitored.
+ internal Accepted(string? location)
+ {
+ Location = location;
+ }
+
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The location at which the status of requested content can be monitored.
+ internal Accepted(Uri locationUri)
+ {
+ if (locationUri == null)
+ {
+ throw new ArgumentNullException(nameof(locationUri));
+ }
+
+ if (locationUri.IsAbsoluteUri)
+ {
+ Location = locationUri.AbsoluteUri;
+ }
+ else
+ {
+ Location = locationUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped);
+ }
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status202Accepted;
+
+ ///
+ /// Gets the location at which the status of the requested content can be monitored.
+ ///
+ public string? Location { get; }
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.AcceptedResult");
+
+ if (!string.IsNullOrEmpty(Location))
+ {
+ httpContext.Response.Headers.Location = Location;
+ }
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
+ }
+}
diff --git a/src/Http/Http.Results/src/AcceptedAtRoute.cs b/src/Http/Http.Results/src/AcceptedAtRoute.cs
new file mode 100644
index 000000000000..96bf99aab6b9
--- /dev/null
+++ b/src/Http/Http.Results/src/AcceptedAtRoute.cs
@@ -0,0 +1,89 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with status code Accepted (202) and Location header.
+/// Targets a registered route.
+///
+public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The route data to use for generating the URL.
+ internal AcceptedAtRoute(object? routeValues)
+ : this(routeName: null, routeValues: routeValues)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The name of the route to use for generating the URL.
+ /// The route data to use for generating the URL.
+ internal AcceptedAtRoute(
+ string? routeName,
+ object? routeValues)
+ {
+ RouteName = routeName;
+ RouteValues = new RouteValueDictionary(routeValues);
+ }
+
+ ///
+ /// Gets the name of the route to use for generating the URL.
+ ///
+ public string? RouteName { get; }
+
+ ///
+ /// Gets the route data to use for generating the URL.
+ ///
+ public RouteValueDictionary RouteValues { get; }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status202Accepted;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ var linkGenerator = httpContext.RequestServices.GetRequiredService();
+ var url = linkGenerator.GetUriByAddress(
+ httpContext,
+ RouteName,
+ RouteValues,
+ fragment: FragmentString.Empty);
+
+ if (string.IsNullOrEmpty(url))
+ {
+ throw new InvalidOperationException("No route matches the supplied values.");
+ }
+
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.AcceptedAtRouteResult");
+
+ httpContext.Response.Headers.Location = url;
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
+ }
+}
diff --git a/src/Http/Http.Results/src/AcceptedAtRouteHttpResult.cs b/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
similarity index 74%
rename from src/Http/Http.Results/src/AcceptedAtRouteHttpResult.cs
rename to src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
index 0e45e84164ce..4855b6e2c89a 100644
--- a/src/Http/Http.Results/src/AcceptedAtRouteHttpResult.cs
+++ b/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
@@ -1,42 +1,43 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
-using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with status code Accepted (202) and Location header.
/// Targets a registered route.
///
-public sealed class AcceptedAtRouteHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The route data to use for generating the URL.
/// The value to format in the entity body.
- internal AcceptedAtRouteHttpResult(object? routeValues, object? value)
+ internal AcceptedAtRoute(object? routeValues, TValue? value)
: this(routeName: null, routeValues: routeValues, value: value)
{
}
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The name of the route to use for generating the URL.
/// The route data to use for generating the URL.
/// The value to format in the entity body.
- internal AcceptedAtRouteHttpResult(
+ internal AcceptedAtRoute(
string? routeName,
object? routeValues,
- object? value)
+ TValue? value)
{
Value = value;
RouteName = routeName;
@@ -47,7 +48,7 @@ internal AcceptedAtRouteHttpResult(
///
/// Gets the object result.
///
- public object? Value { get; }
+ public TValue? Value { get; }
///
/// Gets the name of the route to use for generating the URL.
@@ -60,7 +61,7 @@ internal AcceptedAtRouteHttpResult(
public RouteValueDictionary RouteValues { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status202Accepted;
@@ -84,6 +85,16 @@ public Task ExecuteAsync(HttpContext httpContext)
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.AcceptedAtRouteResult");
httpContext.Response.Headers.Location = url;
- return HttpResultsHelper.WriteResultAsJsonAsync(httpContext, logger, Value, StatusCode);
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return HttpResultsHelper.WriteResultAsJsonAsync(httpContext, logger, Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status202Accepted, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/AcceptedHttpResult.cs b/src/Http/Http.Results/src/AcceptedOfT.cs
similarity index 71%
rename from src/Http/Http.Results/src/AcceptedHttpResult.cs
rename to src/Http/Http.Results/src/AcceptedOfT.cs
index d0b6026e0c56..ebe84dbfe6f4 100644
--- a/src/Http/Http.Results/src/AcceptedHttpResult.cs
+++ b/src/Http/Http.Results/src/AcceptedOfT.cs
@@ -1,26 +1,26 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
-using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with status code Accepted (202) and Location header.
/// Targets a registered route.
///
-public sealed class AcceptedHttpResult : IResult
+public sealed class Accepted : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The location at which the status of requested content can be monitored.
/// The value to format in the entity body.
- internal AcceptedHttpResult(string? location, object? value)
+ internal Accepted(string? location, TValue? value)
{
Value = value;
Location = location;
@@ -28,12 +28,12 @@ internal AcceptedHttpResult(string? location, object? value)
}
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The location at which the status of requested content can be monitored.
/// The value to format in the entity body.
- internal AcceptedHttpResult(Uri locationUri, object? value)
+ internal Accepted(Uri locationUri, TValue? value)
{
Value = value;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -56,10 +56,10 @@ internal AcceptedHttpResult(Uri locationUri, object? value)
///
/// Gets the object result.
///
- public object? Value { get; }
+ public TValue? Value { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status202Accepted;
@@ -79,10 +79,19 @@ public Task ExecuteAsync(HttpContext httpContext)
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.AcceptedResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status202Accepted, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/BadRequest.cs b/src/Http/Http.Results/src/BadRequest.cs
new file mode 100644
index 000000000000..9dd3b161f111
--- /dev/null
+++ b/src/Http/Http.Results/src/BadRequest.cs
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with Bad Request (400) status code.
+///
+public sealed class BadRequest : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ internal BadRequest()
+ {
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status400BadRequest;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.BadRequestObjectResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status400BadRequest));
+ }
+}
diff --git a/src/Http/Http.Results/src/BadRequestObjectHttpResult.cs b/src/Http/Http.Results/src/BadRequestOfT.cs
similarity index 57%
rename from src/Http/Http.Results/src/BadRequestObjectHttpResult.cs
rename to src/Http/Http.Results/src/BadRequestOfT.cs
index dc9ad6e4fb2f..097e3c8793c2 100644
--- a/src/Http/Http.Results/src/BadRequestObjectHttpResult.cs
+++ b/src/Http/Http.Results/src/BadRequestOfT.cs
@@ -1,23 +1,25 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with Bad Request (400) status code.
///
-public sealed class BadRequestObjectHttpResult : IResult
+/// The type of error object that will be JSON serialized to the response body.
+public sealed class BadRequest : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The error content to format in the entity body.
- internal BadRequestObjectHttpResult(object? error)
+ internal BadRequest(TValue? error)
{
Value = error;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -26,10 +28,10 @@ internal BadRequestObjectHttpResult(object? error)
///
/// Gets the object result.
///
- public object? Value { get; internal init; }
+ public TValue? Value { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status400BadRequest;
@@ -40,10 +42,18 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.BadRequestObjectResult");
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger: logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status400BadRequest, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/ChallengeHttpResult.cs b/src/Http/Http.Results/src/ChallengeHttpResult.cs
index cff6c06937dd..1772c6f0d379 100644
--- a/src/Http/Http.Results/src/ChallengeHttpResult.cs
+++ b/src/Http/Http.Results/src/ChallengeHttpResult.cs
@@ -6,7 +6,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// An that on execution invokes .
diff --git a/src/Http/Http.Results/src/Conflict.cs b/src/Http/Http.Results/src/Conflict.cs
new file mode 100644
index 000000000000..12a639bba0e5
--- /dev/null
+++ b/src/Http/Http.Results/src/Conflict.cs
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with Conflict (409) status code.
+///
+public sealed class Conflict : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ internal Conflict()
+ {
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status409Conflict;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ConflictObjectResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status409Conflict));
+ }
+}
diff --git a/src/Http/Http.Results/src/ConflictObjectHttpResult.cs b/src/Http/Http.Results/src/ConflictOfT.cs
similarity index 58%
rename from src/Http/Http.Results/src/ConflictObjectHttpResult.cs
rename to src/Http/Http.Results/src/ConflictOfT.cs
index 782775395bfc..f5fb98e193d6 100644
--- a/src/Http/Http.Results/src/ConflictObjectHttpResult.cs
+++ b/src/Http/Http.Results/src/ConflictOfT.cs
@@ -1,23 +1,25 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with Conflict (409) status code.
///
-public sealed class ConflictObjectHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class Conflict : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The error content to format in the entity body.
- internal ConflictObjectHttpResult(object? error)
+ internal Conflict(TValue? error)
{
Value = error;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -26,10 +28,10 @@ internal ConflictObjectHttpResult(object? error)
///
/// Gets the object result.
///
- public object? Value { get; internal init; }
+ public TValue? Value { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status409Conflict;
@@ -40,10 +42,18 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ConflictObjectResult");
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger: logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status409Conflict, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/ContentHttpResult.cs b/src/Http/Http.Results/src/ContentHttpResult.cs
index a50675408e2d..fa765a137ee0 100644
--- a/src/Http/Http.Results/src/ContentHttpResult.cs
+++ b/src/Http/Http.Results/src/ContentHttpResult.cs
@@ -1,11 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that when executed
/// will produce a response with content.
@@ -30,18 +30,18 @@ internal ContentHttpResult(string? content, string? contentType)
/// The Content-Type header for the response
internal ContentHttpResult(string? content, string? contentType, int? statusCode)
{
- Content = content;
+ ResponseContent = content;
StatusCode = statusCode;
ContentType = contentType;
}
///
- /// Gets or set the content representing the body of the response.
+ /// Gets the content representing the body of the response.
///
- public string? Content { get; internal init; }
+ public string? ResponseContent { get; internal init; }
///
- /// Gets or sets the Content-Type header for the response.
+ /// Gets the Content-Type header for the response.
///
public string? ContentType { get; internal init; }
@@ -61,6 +61,16 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ContentResult");
- return HttpResultsHelper.WriteResultAsContentAsync(httpContext, logger, Content, StatusCode, ContentType);
+ if (StatusCode is { } statusCode)
+ {
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, statusCode);
+ httpContext.Response.StatusCode = statusCode;
+ }
+
+ return HttpResultsHelper.WriteResultAsContentAsync(
+ httpContext,
+ logger,
+ ResponseContent,
+ ContentType);
}
}
diff --git a/src/Http/Http.Results/src/Created.cs b/src/Http/Http.Results/src/Created.cs
new file mode 100644
index 000000000000..0f94c05771d8
--- /dev/null
+++ b/src/Http/Http.Results/src/Created.cs
@@ -0,0 +1,79 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with status code Created (201) and Location header.
+///
+public sealed class Created : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The location at which the content has been created.
+ internal Created(string location)
+ {
+ Location = location;
+ }
+
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The location at which the content has been created.
+ internal Created(Uri locationUri)
+ {
+ if (locationUri == null)
+ {
+ throw new ArgumentNullException(nameof(locationUri));
+ }
+
+ if (locationUri.IsAbsoluteUri)
+ {
+ Location = locationUri.AbsoluteUri;
+ }
+ else
+ {
+ Location = locationUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped);
+ }
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status201Created;
+
+ ///
+ public string? Location { get; }
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.CreatedResult");
+
+ if (!string.IsNullOrEmpty(Location))
+ {
+ httpContext.Response.Headers.Location = Location;
+ }
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status201Created));
+ }
+}
diff --git a/src/Http/Http.Results/src/CreatedAtRoute.cs b/src/Http/Http.Results/src/CreatedAtRoute.cs
new file mode 100644
index 000000000000..7cb9b31f0b53
--- /dev/null
+++ b/src/Http/Http.Results/src/CreatedAtRoute.cs
@@ -0,0 +1,89 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with status code Created (201) and Location header.
+/// Targets a registered route.
+///
+public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The route data to use for generating the URL.
+ internal CreatedAtRoute(object? routeValues)
+ : this(routeName: null, routeValues: routeValues)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class with the values
+ /// provided.
+ ///
+ /// The name of the route to use for generating the URL.
+ /// The route data to use for generating the URL.
+ internal CreatedAtRoute(
+ string? routeName,
+ object? routeValues)
+ {
+ RouteName = routeName;
+ RouteValues = new RouteValueDictionary(routeValues);
+ }
+
+ ///
+ /// Gets the name of the route to use for generating the URL.
+ ///
+ public string? RouteName { get; }
+
+ ///
+ /// Gets the route data to use for generating the URL.
+ ///
+ public RouteValueDictionary RouteValues { get; }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status201Created;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ var linkGenerator = httpContext.RequestServices.GetRequiredService();
+ var url = linkGenerator.GetUriByRouteValues(
+ httpContext,
+ RouteName,
+ RouteValues,
+ fragment: FragmentString.Empty);
+
+ if (string.IsNullOrEmpty(url))
+ {
+ throw new InvalidOperationException("No route matches the supplied values.");
+ }
+
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.CreatedAtRouteResult");
+
+ httpContext.Response.Headers.Location = url;
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status201Created));
+ }
+}
diff --git a/src/Http/Http.Results/src/CreatedAtRouteHttpResult.cs b/src/Http/Http.Results/src/CreatedAtRouteOfT.cs
similarity index 73%
rename from src/Http/Http.Results/src/CreatedAtRouteHttpResult.cs
rename to src/Http/Http.Results/src/CreatedAtRouteOfT.cs
index f59593be8505..c4260b27f0a9 100644
--- a/src/Http/Http.Results/src/CreatedAtRouteHttpResult.cs
+++ b/src/Http/Http.Results/src/CreatedAtRouteOfT.cs
@@ -1,41 +1,43 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with status code Created (201) and Location header.
/// Targets a registered route.
///
-public sealed class CreatedAtRouteHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The route data to use for generating the URL.
/// The value to format in the entity body.
- internal CreatedAtRouteHttpResult(object? routeValues, object? value)
+ internal CreatedAtRoute(object? routeValues, TValue? value)
: this(routeName: null, routeValues: routeValues, value: value)
{
}
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The name of the route to use for generating the URL.
/// The route data to use for generating the URL.
/// The value to format in the entity body.
- internal CreatedAtRouteHttpResult(
+ internal CreatedAtRoute(
string? routeName,
object? routeValues,
- object? value)
+ TValue? value)
{
Value = value;
RouteName = routeName;
@@ -46,7 +48,7 @@ internal CreatedAtRouteHttpResult(
///
/// Gets the object result.
///
- public object? Value { get; }
+ public TValue? Value { get; }
///
/// Gets the name of the route to use for generating the URL.
@@ -56,10 +58,10 @@ internal CreatedAtRouteHttpResult(
///
/// Gets the route data to use for generating the URL.
///
- public RouteValueDictionary? RouteValues { get; }
+ public RouteValueDictionary RouteValues { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status201Created;
@@ -83,10 +85,19 @@ public Task ExecuteAsync(HttpContext httpContext)
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.CreatedAtRouteResult");
httpContext.Response.Headers.Location = url;
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status201Created, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/CreatedHttpResult.cs b/src/Http/Http.Results/src/CreatedOfT.cs
similarity index 68%
rename from src/Http/Http.Results/src/CreatedHttpResult.cs
rename to src/Http/Http.Results/src/CreatedOfT.cs
index 4106cacd7fec..5523c5f87a7c 100644
--- a/src/Http/Http.Results/src/CreatedHttpResult.cs
+++ b/src/Http/Http.Results/src/CreatedOfT.cs
@@ -1,24 +1,26 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with status code Created (201) and Location header.
///
-public sealed class CreatedHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class Created : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The location at which the content has been created.
/// The value to format in the entity body.
- internal CreatedHttpResult(string location, object? value)
+ internal Created(string location, TValue? value)
{
Value = value;
Location = location;
@@ -26,12 +28,12 @@ internal CreatedHttpResult(string location, object? value)
}
///
- /// Initializes a new instance of the class with the values
+ /// Initializes a new instance of the class with the values
/// provided.
///
/// The location at which the content has been created.
/// The value to format in the entity body.
- internal CreatedHttpResult(Uri locationUri, object? value)
+ internal Created(Uri locationUri, TValue? value)
{
Value = value;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -54,10 +56,10 @@ internal CreatedHttpResult(Uri locationUri, object? value)
///
/// Gets the object result.
///
- public object? Value { get; }
+ public TValue? Value { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status201Created;
@@ -75,10 +77,19 @@ public Task ExecuteAsync(HttpContext httpContext)
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.CreatedResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status201Created, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/EmptyHttpResult.cs b/src/Http/Http.Results/src/EmptyHttpResult.cs
index 9e9b25c166dd..ccdc3bd05984 100644
--- a/src/Http/Http.Results/src/EmptyHttpResult.cs
+++ b/src/Http/Http.Results/src/EmptyHttpResult.cs
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// Represents an that when executed will
diff --git a/src/Http/Http.Results/src/FileContentHttpResult.cs b/src/Http/Http.Results/src/FileContentHttpResult.cs
index 56cd17d13944..960836b99479 100644
--- a/src/Http/Http.Results/src/FileContentHttpResult.cs
+++ b/src/Http/Http.Results/src/FileContentHttpResult.cs
@@ -6,7 +6,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// Represents an that when executed will
diff --git a/src/Http/Http.Results/src/FileStreamHttpResult.cs b/src/Http/Http.Results/src/FileStreamHttpResult.cs
index 4a2273c535f0..eff283d20d2d 100644
--- a/src/Http/Http.Results/src/FileStreamHttpResult.cs
+++ b/src/Http/Http.Results/src/FileStreamHttpResult.cs
@@ -6,7 +6,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// Represents an that when executed will
diff --git a/src/Http/Http.Results/src/ForbidHttpResult.cs b/src/Http/Http.Results/src/ForbidHttpResult.cs
index f9d8d9c27897..5afdb53b85d2 100644
--- a/src/Http/Http.Results/src/ForbidHttpResult.cs
+++ b/src/Http/Http.Results/src/ForbidHttpResult.cs
@@ -6,7 +6,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// An that on execution invokes .
diff --git a/src/Http/Http.Results/src/HttpResultsHelper.cs b/src/Http/Http.Results/src/HttpResultsHelper.cs
index f447e1d9539e..b899467b1d80 100644
--- a/src/Http/Http.Results/src/HttpResultsHelper.cs
+++ b/src/Http/Http.Results/src/HttpResultsHelper.cs
@@ -10,34 +10,28 @@
using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Http;
+
internal static partial class HttpResultsHelper
{
private const string DefaultContentType = "text/plain; charset=utf-8";
private static readonly Encoding DefaultEncoding = Encoding.UTF8;
- public static Task WriteResultAsJsonAsync(
+ public static Task WriteResultAsJsonAsync(
HttpContext httpContext,
ILogger logger,
- object? value,
- int? statusCode,
+ T? value,
string? contentType = null,
JsonSerializerOptions? jsonSerializerOptions = null)
{
- Log.WritingResultAsJson(logger, value, statusCode);
-
- if (statusCode is { } code)
- {
- httpContext.Response.StatusCode = code;
- }
-
if (value is null)
{
return Task.CompletedTask;
}
+ Log.WritingResultAsJson(logger, typeof(T).Name);
+
return httpContext.Response.WriteAsJsonAsync(
value,
- value.GetType(),
options: jsonSerializerOptions,
contentType: contentType);
}
@@ -46,7 +40,6 @@ public static Task WriteResultAsContentAsync(
HttpContext httpContext,
ILogger logger,
string? content,
- int? statusCode,
string? contentType = null)
{
var response = httpContext.Response;
@@ -60,11 +53,6 @@ public static Task WriteResultAsContentAsync(
response.ContentType = resolvedContentType;
- if (statusCode is { } code)
- {
- response.StatusCode = code;
- }
-
Log.WritingResultAsContent(logger, resolvedContentType);
if (content != null)
@@ -163,29 +151,6 @@ public static void ApplyProblemDetailsDefaults(ProblemDetails problemDetails, in
internal static partial class Log
{
- public static void WritingResultAsJson(ILogger logger, object? value, int? statusCode)
- {
- if (logger.IsEnabled(LogLevel.Information))
- {
- if (value is null)
- {
- WritingResultAsJsonWithoutValue(logger, statusCode ?? StatusCodes.Status200OK);
- }
- else
- {
- var valueType = value.GetType().FullName!;
- WritingResultAsJson(logger, type: valueType, statusCode ?? StatusCodes.Status200OK);
- }
- }
- }
- public static void WritingResultAsFile(ILogger logger, string fileDownloadName)
- {
- if (logger.IsEnabled(LogLevel.Information))
- {
- WritingResultAsFileWithNoFileName(logger, fileDownloadName: fileDownloadName);
- }
- }
-
[LoggerMessage(1, LogLevel.Information,
"Setting HTTP status code {StatusCode}.",
EventName = "WritingResultAsStatusCode")]
@@ -196,20 +161,13 @@ public static void WritingResultAsFile(ILogger logger, string fileDownloadName)
EventName = "WritingResultAsContent")]
public static partial void WritingResultAsContent(ILogger logger, string contentType);
- [LoggerMessage(3, LogLevel.Information, "Writing value of type '{Type}' as Json with status code '{StatusCode}'.",
- EventName = "WritingResultAsJson",
- SkipEnabledCheck = true)]
- private static partial void WritingResultAsJson(ILogger logger, string type, int statusCode);
-
- [LoggerMessage(4, LogLevel.Information, "Setting the status code '{StatusCode}' without value.",
- EventName = "WritingResultAsJsonWithoutValue",
- SkipEnabledCheck = true)]
- private static partial void WritingResultAsJsonWithoutValue(ILogger logger, int statusCode);
+ [LoggerMessage(3, LogLevel.Information, "Writing value of type '{Type}' as Json.",
+ EventName = "WritingResultAsJson")]
+ public static partial void WritingResultAsJson(ILogger logger, string type);
[LoggerMessage(5, LogLevel.Information,
"Sending file with download name '{FileDownloadName}'.",
- EventName = "WritingResultAsFileWithNoFileName",
- SkipEnabledCheck = true)]
- private static partial void WritingResultAsFileWithNoFileName(ILogger logger, string fileDownloadName);
+ EventName = "WritingResultAsFileWithNoFileName")]
+ public static partial void WritingResultAsFile(ILogger logger, string fileDownloadName);
}
}
diff --git a/src/Http/Http.Results/src/JsonHttpResult.cs b/src/Http/Http.Results/src/JsonHttpResultOfT.cs
similarity index 72%
rename from src/Http/Http.Results/src/JsonHttpResult.cs
rename to src/Http/Http.Results/src/JsonHttpResultOfT.cs
index 1e7800a32bdb..dec845ac206a 100644
--- a/src/Http/Http.Results/src/JsonHttpResult.cs
+++ b/src/Http/Http.Results/src/JsonHttpResultOfT.cs
@@ -2,63 +2,70 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text.Json;
+using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// An action result which formats the given object as JSON.
///
-public sealed class JsonHttpResult : IResult
+public sealed partial class JsonHttpResult : IResult
{
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
/// The serializer settings.
- internal JsonHttpResult(object? value, JsonSerializerOptions? jsonSerializerOptions)
+ internal JsonHttpResult(TValue? value, JsonSerializerOptions? jsonSerializerOptions)
: this(value, statusCode: null, contentType: null, jsonSerializerOptions: jsonSerializerOptions)
{
}
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
/// The HTTP status code of the response.
/// The serializer settings.
- internal JsonHttpResult(object? value, int? statusCode, JsonSerializerOptions? jsonSerializerOptions)
+ internal JsonHttpResult(TValue? value, int? statusCode, JsonSerializerOptions? jsonSerializerOptions)
: this(value, statusCode: statusCode, contentType: null, jsonSerializerOptions: jsonSerializerOptions)
{
}
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
/// The value for the Content-Type header
/// The serializer settings.
- internal JsonHttpResult(object? value, string? contentType, JsonSerializerOptions? jsonSerializerOptions)
+ internal JsonHttpResult(TValue? value, string? contentType, JsonSerializerOptions? jsonSerializerOptions)
: this(value, statusCode: null, contentType: contentType, jsonSerializerOptions: jsonSerializerOptions)
{
}
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
/// The HTTP status code of the response.
/// The serializer settings.
/// The value for the Content-Type header
- internal JsonHttpResult(object? value, int? statusCode, string? contentType, JsonSerializerOptions? jsonSerializerOptions)
+ internal JsonHttpResult(TValue? value, int? statusCode, string? contentType, JsonSerializerOptions? jsonSerializerOptions)
{
Value = value;
- StatusCode = statusCode;
JsonSerializerOptions = jsonSerializerOptions;
ContentType = contentType;
- HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
+
+ if (value is ProblemDetails problemDetails)
+ {
+ HttpResultsHelper.ApplyProblemDetailsDefaults(problemDetails, statusCode);
+ statusCode ??= problemDetails.Status;
+ }
+
+ StatusCode = statusCode;
}
///
@@ -69,7 +76,7 @@ internal JsonHttpResult(object? value, int? statusCode, string? contentType, Jso
///
/// Gets the object result.
///
- public object? Value { get; }
+ public TValue? Value { get; }
///
/// Gets the value for the Content-Type header.
@@ -88,11 +95,16 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.JsonResult");
+ if (StatusCode is { } statusCode)
+ {
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, statusCode);
+ httpContext.Response.StatusCode = statusCode;
+ }
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger,
Value,
- StatusCode,
ContentType,
JsonSerializerOptions);
}
diff --git a/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj b/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
index 0d9845104cc4..de0934e22002 100644
--- a/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
+++ b/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
@@ -17,6 +17,8 @@
+
+
@@ -33,6 +35,14 @@
+
+
+ True
+ True
+ ResultsCache.StatusCodes.tt
+
+
+
TextTemplatingFileGenerator
diff --git a/src/Http/Http.Results/src/NoContentHttpResult.cs b/src/Http/Http.Results/src/NoContent.cs
similarity index 65%
rename from src/Http/Http.Results/src/NoContentHttpResult.cs
rename to src/Http/Http.Results/src/NoContent.cs
index 0339cc3f1f38..68920021f36c 100644
--- a/src/Http/Http.Results/src/NoContentHttpResult.cs
+++ b/src/Http/Http.Results/src/NoContent.cs
@@ -1,26 +1,27 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// Represents an that when executed will
/// produce an HTTP response with the No Content (204) status code.
///
-public class NoContentHttpResult : IResult
+public class NoContent : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
- internal NoContentHttpResult()
+ internal NoContent()
{
}
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status204NoContent;
@@ -37,4 +38,10 @@ public Task ExecuteAsync(HttpContext httpContext)
return Task.CompletedTask;
}
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status204NoContent));
+ }
}
diff --git a/src/Http/Http.Results/src/NotFound.cs b/src/Http/Http.Results/src/NotFound.cs
new file mode 100644
index 000000000000..9b0dbe7848d1
--- /dev/null
+++ b/src/Http/Http.Results/src/NotFound.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with Not Found (404) status code.
+///
+public sealed class NotFound : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values.
+ ///
+ internal NotFound()
+ {
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status404NotFound;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.NotFoundObjectResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status404NotFound));
+ }
+}
diff --git a/src/Http/Http.Results/src/NotFoundObjectHttpResult.cs b/src/Http/Http.Results/src/NotFoundOfT.cs
similarity index 57%
rename from src/Http/Http.Results/src/NotFoundObjectHttpResult.cs
rename to src/Http/Http.Results/src/NotFoundOfT.cs
index 45220b7d0483..8e1bacf533ee 100644
--- a/src/Http/Http.Results/src/NotFoundObjectHttpResult.cs
+++ b/src/Http/Http.Results/src/NotFoundOfT.cs
@@ -1,22 +1,24 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with Not Found (404) status code.
///
-public sealed class NotFoundObjectHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class NotFound : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
- internal NotFoundObjectHttpResult(object? value)
+ internal NotFound(TValue? value)
{
Value = value;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -25,10 +27,10 @@ internal NotFoundObjectHttpResult(object? value)
///
/// Gets the object result.
///
- public object? Value { get; internal init; }
+ public TValue? Value { get; internal init; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status404NotFound;
@@ -39,10 +41,18 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.NotFoundObjectResult");
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger: logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status404NotFound, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/ObjectHttpResult.cs b/src/Http/Http.Results/src/ObjectHttpResult.cs
deleted file mode 100644
index 252ab122a1da..000000000000
--- a/src/Http/Http.Results/src/ObjectHttpResult.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Http;
-
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-
-///
-/// An that on execution will write an object to the response.
-///
-internal sealed class ObjectHttpResult : IResult
-{
- ///
- /// Creates a new instance
- /// with the provided .
- ///
- internal ObjectHttpResult(object? value)
- : this(value, null)
- {
- }
-
- ///
- /// Creates a new instance with the provided
- /// , .
- ///
- internal ObjectHttpResult(object? value, int? statusCode)
- : this(value, statusCode, contentType: null)
- {
- }
-
- ///
- /// Creates a new instance with the provided
- /// , and .
- ///
- internal ObjectHttpResult(object? value, int? statusCode, string? contentType)
- {
- Value = value;
-
- if (value is ProblemDetails problemDetails)
- {
- HttpResultsHelper.ApplyProblemDetailsDefaults(problemDetails, statusCode);
- statusCode ??= problemDetails.Status;
- }
-
- StatusCode = statusCode;
- ContentType = contentType;
- }
-
- ///
- /// Gets the object result.
- ///
- public object? Value { get; internal init; }
-
- ///
- /// Gets or sets the value for the Content-Type header.
- ///
- public string? ContentType { get; internal init; }
-
- ///
- /// Gets the HTTP status code.
- ///
- public int? StatusCode { get; internal init; }
-
- ///
- public Task ExecuteAsync(HttpContext httpContext)
- {
- // Creating the logger with a string to preserve the category after the refactoring.
- var loggerFactory = httpContext.RequestServices.GetRequiredService();
- var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ObjectResult");
-
- return HttpResultsHelper.WriteResultAsJsonAsync(
- httpContext,
- logger: logger,
- Value,
- StatusCode,
- ContentType);
- }
-}
diff --git a/src/Http/Http.Results/src/Ok.cs b/src/Http/Http.Results/src/Ok.cs
new file mode 100644
index 000000000000..8d2197d0e458
--- /dev/null
+++ b/src/Http/Http.Results/src/Ok.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+///
+/// An that on execution will write an object to the response
+/// with Ok (200) status code.
+///
+public sealed class Ok : IResult, IEndpointMetadataProvider
+{
+ ///
+ /// Initializes a new instance of the class with the values.
+ ///
+ internal Ok()
+ {
+ }
+
+ ///
+ /// Gets the HTTP status code:
+ ///
+ public int StatusCode => StatusCodes.Status200OK;
+
+ ///
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.OkObjectResult");
+
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
+ return Task.CompletedTask;
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status200OK));
+ }
+}
diff --git a/src/Http/Http.Results/src/OkObjectHttpResult.cs b/src/Http/Http.Results/src/OkOfT.cs
similarity index 58%
rename from src/Http/Http.Results/src/OkObjectHttpResult.cs
rename to src/Http/Http.Results/src/OkOfT.cs
index 2dedc139d7ab..ccbef8a73b79 100644
--- a/src/Http/Http.Results/src/OkObjectHttpResult.cs
+++ b/src/Http/Http.Results/src/OkOfT.cs
@@ -1,23 +1,24 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
-using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write an object to the response
/// with Ok (200) status code.
///
-public sealed class OkObjectHttpResult : IResult
+/// The type of object that will be JSON serialized to the response body.
+public sealed class Ok : IResult, IEndpointMetadataProvider
{
///
- /// Initializes a new instance of the class with the values.
+ /// Initializes a new instance of the class with the values.
///
/// The value to format in the entity body.
- internal OkObjectHttpResult(object? value)
+ internal Ok(TValue? value)
{
Value = value;
HttpResultsHelper.ApplyProblemDetailsDefaultsIfNeeded(Value, StatusCode);
@@ -26,10 +27,10 @@ internal OkObjectHttpResult(object? value)
///
/// Gets the object result.
///
- public object? Value { get; internal init; }
+ public TValue? Value { get; }
///
- /// Gets the HTTP status code.
+ /// Gets the HTTP status code:
///
public int StatusCode => StatusCodes.Status200OK;
@@ -40,10 +41,18 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.OkObjectResult");
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, StatusCode);
+ httpContext.Response.StatusCode = StatusCode;
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger: logger,
- Value,
- StatusCode);
+ Value);
+ }
+
+ ///
+ static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status200OK, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/PhysicalFileHttpResult.cs b/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
index 97f8e01dca38..4e69b71a88f6 100644
--- a/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
+++ b/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
@@ -5,7 +5,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
-namespace Microsoft.AspNetCore.Http;
+namespace Microsoft.AspNetCore.Http.HttpResults;
///
/// A on execution will write a file from disk to the response
diff --git a/src/Http/Http.Results/src/ProblemHttpResult.cs b/src/Http/Http.Results/src/ProblemHttpResult.cs
index 0a5c52a0fcca..a0861eaf567b 100644
--- a/src/Http/Http.Results/src/ProblemHttpResult.cs
+++ b/src/Http/Http.Results/src/ProblemHttpResult.cs
@@ -1,12 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http;
-
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
///
/// An that on execution will write Problem Details
/// HTTP API responses based on https://tools.ietf.org/html/rfc7807
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http;
public sealed class ProblemHttpResult : IResult
{
///
- /// Creates a new instance with
+ /// Creates a new instance with
/// the provided .
///
/// The instance to format in the entity body.
@@ -30,7 +30,7 @@ internal ProblemHttpResult(ProblemDetails problemDetails)
public ProblemDetails ProblemDetails { get; }
///
- /// Gets or sets the value for the Content-Type header.
+ /// Gets the value for the Content-Type header: application/problem+json
///
public string ContentType => "application/problem+json";
@@ -45,11 +45,16 @@ public Task ExecuteAsync(HttpContext httpContext)
var loggerFactory = httpContext.RequestServices.GetRequiredService();
var logger = loggerFactory.CreateLogger(typeof(ProblemHttpResult));
+ if (StatusCode is { } code)
+ {
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, code);
+ httpContext.Response.StatusCode = code;
+ }
+
return HttpResultsHelper.WriteResultAsJsonAsync(
httpContext,
logger,
value: ProblemDetails,
- StatusCode,
ContentType);
}
}
diff --git a/src/Http/Http.Results/src/PublicAPI.Unshipped.txt b/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
index 162a8ca3601f..e87a32cfd7d1 100644
--- a/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
@@ -1,184 +1,272 @@
#nullable enable
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult.RouteName.get -> string?
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.AcceptedAtRouteHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.AcceptedHttpResult
-Microsoft.AspNetCore.Http.AcceptedHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.AcceptedHttpResult.Location.get -> string?
-Microsoft.AspNetCore.Http.AcceptedHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.AcceptedHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.BadRequestObjectHttpResult
-Microsoft.AspNetCore.Http.BadRequestObjectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.BadRequestObjectHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.BadRequestObjectHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.ChallengeHttpResult
-Microsoft.AspNetCore.Http.ChallengeHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
-Microsoft.AspNetCore.Http.ChallengeHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.ChallengeHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
-Microsoft.AspNetCore.Http.ConflictObjectHttpResult
-Microsoft.AspNetCore.Http.ConflictObjectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.ConflictObjectHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.ConflictObjectHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.ContentHttpResult
-Microsoft.AspNetCore.Http.ContentHttpResult.Content.get -> string?
-Microsoft.AspNetCore.Http.ContentHttpResult.ContentType.get -> string?
-Microsoft.AspNetCore.Http.ContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.ContentHttpResult.StatusCode.get -> int?
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult.RouteName.get -> string?
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.CreatedAtRouteHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.CreatedHttpResult
-Microsoft.AspNetCore.Http.CreatedHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.CreatedHttpResult.Location.get -> string?
-Microsoft.AspNetCore.Http.CreatedHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.CreatedHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.EmptyHttpResult
-Microsoft.AspNetCore.Http.EmptyHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.FileContentHttpResult
-Microsoft.AspNetCore.Http.FileContentHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.FileContentHttpResult.EnableRangeProcessing.get -> bool
-Microsoft.AspNetCore.Http.FileContentHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
-Microsoft.AspNetCore.Http.FileContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.FileContentHttpResult.FileContents.get -> System.ReadOnlyMemory
-Microsoft.AspNetCore.Http.FileContentHttpResult.FileDownloadName.get -> string?
-Microsoft.AspNetCore.Http.FileContentHttpResult.FileLength.get -> long?
-Microsoft.AspNetCore.Http.FileContentHttpResult.LastModified.get -> System.DateTimeOffset?
-Microsoft.AspNetCore.Http.FileStreamHttpResult
-Microsoft.AspNetCore.Http.FileStreamHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.FileStreamHttpResult.EnableRangeProcessing.get -> bool
-Microsoft.AspNetCore.Http.FileStreamHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
-Microsoft.AspNetCore.Http.FileStreamHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.FileStreamHttpResult.FileDownloadName.get -> string?
-Microsoft.AspNetCore.Http.FileStreamHttpResult.FileLength.get -> long?
-Microsoft.AspNetCore.Http.FileStreamHttpResult.FileStream.get -> System.IO.Stream!
-Microsoft.AspNetCore.Http.FileStreamHttpResult.LastModified.get -> System.DateTimeOffset?
-Microsoft.AspNetCore.Http.ForbidHttpResult
-Microsoft.AspNetCore.Http.ForbidHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
-Microsoft.AspNetCore.Http.ForbidHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.ForbidHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
-Microsoft.AspNetCore.Http.JsonHttpResult
-Microsoft.AspNetCore.Http.JsonHttpResult.ContentType.get -> string?
-Microsoft.AspNetCore.Http.JsonHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.JsonHttpResult.JsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions?
-Microsoft.AspNetCore.Http.JsonHttpResult.StatusCode.get -> int?
-Microsoft.AspNetCore.Http.JsonHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.NoContentHttpResult
-Microsoft.AspNetCore.Http.NoContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.NoContentHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.NotFoundObjectHttpResult
-Microsoft.AspNetCore.Http.NotFoundObjectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.NotFoundObjectHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.NotFoundObjectHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.OkObjectHttpResult
-Microsoft.AspNetCore.Http.OkObjectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.OkObjectHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.OkObjectHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.EnableRangeProcessing.get -> bool
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.FileDownloadName.get -> string?
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.FileLength.get -> long?
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.FileName.get -> string!
-Microsoft.AspNetCore.Http.PhysicalFileHttpResult.LastModified.get -> System.DateTimeOffset?
-Microsoft.AspNetCore.Http.ProblemHttpResult
-Microsoft.AspNetCore.Http.ProblemHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.ProblemHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.ProblemHttpResult.ProblemDetails.get -> Microsoft.AspNetCore.Mvc.ProblemDetails!
-Microsoft.AspNetCore.Http.ProblemHttpResult.StatusCode.get -> int?
-Microsoft.AspNetCore.Http.PushStreamHttpResult
-Microsoft.AspNetCore.Http.PushStreamHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.PushStreamHttpResult.EnableRangeProcessing.get -> bool
-Microsoft.AspNetCore.Http.PushStreamHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
-Microsoft.AspNetCore.Http.PushStreamHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.PushStreamHttpResult.FileDownloadName.get -> string?
-Microsoft.AspNetCore.Http.PushStreamHttpResult.FileLength.get -> long?
-Microsoft.AspNetCore.Http.PushStreamHttpResult.LastModified.get -> System.DateTimeOffset?
-Microsoft.AspNetCore.Http.RedirectHttpResult
-Microsoft.AspNetCore.Http.RedirectHttpResult.AcceptLocalUrlOnly.get -> bool
-Microsoft.AspNetCore.Http.RedirectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.RedirectHttpResult.Permanent.get -> bool
-Microsoft.AspNetCore.Http.RedirectHttpResult.PreserveMethod.get -> bool
-Microsoft.AspNetCore.Http.RedirectHttpResult.Url.get -> string!
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.Fragment.get -> string?
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.Permanent.get -> bool
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.PreserveMethod.get -> bool
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.RouteName.get -> string?
-Microsoft.AspNetCore.Http.RedirectToRouteHttpResult.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
-Microsoft.AspNetCore.Http.Results
-Microsoft.AspNetCore.Http.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.Results
-Microsoft.AspNetCore.Http.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.Results
-Microsoft.AspNetCore.Http.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.Results
-Microsoft.AspNetCore.Http.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.Results
-Microsoft.AspNetCore.Http.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult5 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult6 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult5 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.Results!
-static Microsoft.AspNetCore.Http.Results.implicit operator Microsoft.AspNetCore.Http.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.Results!
-Microsoft.AspNetCore.Http.SignInHttpResult
-Microsoft.AspNetCore.Http.SignInHttpResult.AuthenticationScheme.get -> string?
-Microsoft.AspNetCore.Http.SignInHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.SignInHttpResult.Principal.get -> System.Security.Claims.ClaimsPrincipal!
-Microsoft.AspNetCore.Http.SignInHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
-Microsoft.AspNetCore.Http.SignOutHttpResult
-Microsoft.AspNetCore.Http.SignOutHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
-Microsoft.AspNetCore.Http.SignOutHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.SignOutHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
-Microsoft.AspNetCore.Http.StatusCodeHttpResult
-Microsoft.AspNetCore.Http.StatusCodeHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.StatusCodeHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.UnauthorizedHttpResult
-Microsoft.AspNetCore.Http.UnauthorizedHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.UnauthorizedHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.UnprocessableEntityObjectHttpResult
-Microsoft.AspNetCore.Http.UnprocessableEntityObjectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.UnprocessableEntityObjectHttpResult.StatusCode.get -> int
-Microsoft.AspNetCore.Http.UnprocessableEntityObjectHttpResult.Value.get -> object?
-Microsoft.AspNetCore.Http.VirtualFileHttpResult
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.ContentType.get -> string!
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.EnableRangeProcessing.get -> bool
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.FileDownloadName.get -> string?
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.FileLength.get -> long?
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.FileName.get -> string!
-Microsoft.AspNetCore.Http.VirtualFileHttpResult.LastModified.get -> System.DateTimeOffset?
-static Microsoft.AspNetCore.Http.EmptyHttpResult.Instance.get -> Microsoft.AspNetCore.Http.EmptyHttpResult!
+Microsoft.AspNetCore.Http.HttpResults.Accepted
+Microsoft.AspNetCore.Http.HttpResults.Accepted.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Accepted.Location.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.Accepted.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Accepted
+Microsoft.AspNetCore.Http.HttpResults.Accepted.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Accepted.Location.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.Accepted.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Accepted.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.RouteName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.RouteName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.AcceptedAtRoute.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.BadRequest
+Microsoft.AspNetCore.Http.HttpResults.BadRequest.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.BadRequest.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.BadRequest
+Microsoft.AspNetCore.Http.HttpResults.BadRequest.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.BadRequest.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.BadRequest.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.ChallengeHttpResult
+Microsoft.AspNetCore.Http.HttpResults.ChallengeHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
+Microsoft.AspNetCore.Http.HttpResults.ChallengeHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.ChallengeHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
+Microsoft.AspNetCore.Http.HttpResults.Conflict
+Microsoft.AspNetCore.Http.HttpResults.Conflict.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Conflict.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Conflict
+Microsoft.AspNetCore.Http.HttpResults.Conflict.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Conflict.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Conflict.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult
+Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult.ContentType.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult.ResponseContent.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult.StatusCode.get -> int?
+Microsoft.AspNetCore.Http.HttpResults.Created
+Microsoft.AspNetCore.Http.HttpResults.Created.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Created.Location.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.Created.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Created
+Microsoft.AspNetCore.Http.HttpResults.Created.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Created.Location.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.Created.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Created.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.RouteName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.RouteName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.CreatedAtRoute.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult
+Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.EnableRangeProcessing.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.FileContents.get -> System.ReadOnlyMemory
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.FileLength.get -> long?
+Microsoft.AspNetCore.Http.HttpResults.FileContentHttpResult.LastModified.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.EnableRangeProcessing.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.FileLength.get -> long?
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.FileStream.get -> System.IO.Stream!
+Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult.LastModified.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.Http.HttpResults.ForbidHttpResult
+Microsoft.AspNetCore.Http.HttpResults.ForbidHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
+Microsoft.AspNetCore.Http.HttpResults.ForbidHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.ForbidHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult.ContentType.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult.JsonSerializerOptions.get -> System.Text.Json.JsonSerializerOptions?
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult.StatusCode.get -> int?
+Microsoft.AspNetCore.Http.HttpResults.JsonHttpResult.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.NoContent
+Microsoft.AspNetCore.Http.HttpResults.NoContent.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.NoContent.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.NotFound
+Microsoft.AspNetCore.Http.HttpResults.NotFound.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.NotFound.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.NotFound
+Microsoft.AspNetCore.Http.HttpResults.NotFound.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.NotFound.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.NotFound.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.Ok
+Microsoft.AspNetCore.Http.HttpResults.Ok.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Ok.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Ok
+Microsoft.AspNetCore.Http.HttpResults.Ok.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Ok.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.Ok.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.EnableRangeProcessing.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.FileLength.get -> long?
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.FileName.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.PhysicalFileHttpResult.LastModified.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ProblemDetails.get -> Microsoft.AspNetCore.Mvc.ProblemDetails!
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.StatusCode.get -> int?
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.EnableRangeProcessing.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.FileLength.get -> long?
+Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.LastModified.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult.AcceptLocalUrlOnly.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult.Permanent.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult.PreserveMethod.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.RedirectHttpResult.Url.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.Fragment.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.Permanent.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.PreserveMethod.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.RouteName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
+Microsoft.AspNetCore.Http.HttpResults.Results
+Microsoft.AspNetCore.Http.HttpResults.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.Results
+Microsoft.AspNetCore.Http.HttpResults.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.Results
+Microsoft.AspNetCore.Http.HttpResults.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.Results
+Microsoft.AspNetCore.Http.HttpResults.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.Results
+Microsoft.AspNetCore.Http.HttpResults.Results.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Results.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult
+Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.AuthenticationScheme.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.Principal.get -> System.Security.Claims.ClaimsPrincipal!
+Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
+Microsoft.AspNetCore.Http.HttpResults.SignOutHttpResult
+Microsoft.AspNetCore.Http.HttpResults.SignOutHttpResult.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList!
+Microsoft.AspNetCore.Http.HttpResults.SignOutHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.SignOutHttpResult.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
+Microsoft.AspNetCore.Http.HttpResults.StatusCodeHttpResult
+Microsoft.AspNetCore.Http.HttpResults.StatusCodeHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.StatusCodeHttpResult.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.UnauthorizedHttpResult
+Microsoft.AspNetCore.Http.HttpResults.UnauthorizedHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.UnauthorizedHttpResult.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity.Value.get -> TValue?
+Microsoft.AspNetCore.Http.HttpResults.ValidationProblem
+Microsoft.AspNetCore.Http.HttpResults.ValidationProblem.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.ValidationProblem.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.ValidationProblem.ProblemDetails.get -> Microsoft.AspNetCore.Http.HttpValidationProblemDetails!
+Microsoft.AspNetCore.Http.HttpResults.ValidationProblem.StatusCode.get -> int
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.ContentType.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.EnableRangeProcessing.get -> bool
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.EntityTag.get -> Microsoft.Net.Http.Headers.EntityTagHeaderValue?
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.FileLength.get -> long?
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.FileName.get -> string!
+Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.LastModified.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.Http.TypedResults
+static Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult.Instance.get -> Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult6 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
+static Microsoft.AspNetCore.Http.HttpResults.Results.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results!
static Microsoft.AspNetCore.Http.Results.Bytes(System.ReadOnlyMemory contents, string? contentType = null, string? fileDownloadName = null, bool enableRangeProcessing = false, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null) -> Microsoft.AspNetCore.Http.IResult!
static Microsoft.AspNetCore.Http.Results.Empty.get -> Microsoft.AspNetCore.Http.IResult!
static Microsoft.AspNetCore.Http.Results.Stream(System.Func! streamWriterCallback, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null) -> Microsoft.AspNetCore.Http.IResult!
static Microsoft.AspNetCore.Http.Results.Stream(System.IO.Pipelines.PipeReader! pipeReader, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null, bool enableRangeProcessing = false) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.TypedResults.Accepted(System.Uri! uri) -> Microsoft.AspNetCore.Http.HttpResults.Accepted!
+static Microsoft.AspNetCore.Http.TypedResults.Accepted(string? uri) -> Microsoft.AspNetCore.Http.HttpResults.Accepted!
+static Microsoft.AspNetCore.Http.TypedResults.Accepted(System.Uri! uri, TValue? value) -> Microsoft.AspNetCore.Http.HttpResults.Accepted!
+static Microsoft.AspNetCore.Http.TypedResults.Accepted