-
Notifications
You must be signed in to change notification settings - Fork 10.4k
Open
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-mvcIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesfeature-mvc-application-modelFeatures related to MVC application model, discovery, application partsFeatures related to MVC application model, discovery, application parts
Milestone
Description
Background and Motivation
When mixing MVC Controllers with Api Controllers in an application, there should be a global setting in ApiBehaviorOptions to turn off the IStatusCodePagesFeature for Api Controllers to avoid overriding the raw api response with an MVC view/html based status code page implementation.
Proposed API
namespace Microsoft.AspNetCore.Mvc;
public class ApiBehaviorOptions : IEnumerable<ICompatibilitySwitch>
{
+ public bool SkipStatusCodePages { get; set; }
}
Usage Examples
// Program.cs Minimal API
var builder = WebApplication.CreateBuilder(args);
// Register services
app.AddMvc().ConfigureApiBehaviorOptions(options =>
{
options.SkipStatusCodePages = true;
});
var app = builder.Build();
// Register middlewares
app.MapControllers();
await app.RunAsync();
Alternative Designs
public static class SkipStatusCodePagesMetadataExtensions
{
public static IEndpointConventionBuilder SkipStatusCodePagesForApiControllers(this IEndpointConventionBuilder builder)
{
builder.Add(endpointBuilder =>
{
var apiControllerAttribute = endpointBuilder.Metadata.FirstOrDefault(m => m.GetType() == typeof(ApiControllerAttribute)) as ApiControllerAttribute;
if (apiControllerAttribute == null)
{
return;
}
endpointBuilder.Metadata.Add(new SkipStatusCodePagesMetadata());
endpointBuilder.FilterFactories.Add((context, next) =>
{
return async context =>
{
var statusCodeFeature = context.HttpContext.Features.Get<IStatusCodePagesFeature>();
if (statusCodeFeature != null)
{
// Turn off the StatusCodePages feature.
statusCodeFeature.Enabled = false;
}
return await next(context);
};
});
});
return builder;
}
}
// Marker metadata class
file class SkipStatusCodePagesMetadata : ISkipStatusCodePagesMetadata
{
}
// Program.cs Minimal API
var builder = WebApplication.CreateBuilder(args);
// Register services
app.AddMvc();
var app = builder.Build();
// Register middlewares
app.MapControllers().SkipStatusCodePagesForApiControllers();
await app.RunAsync();
Risks
There are no risks because the default value for ApiBehaviorOptions.SkipStatusCodePages
will be false
which is the current behavior.
Metadata
Metadata
Assignees
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarea-mvcIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesIncludes: MVC, Actions and Controllers, Localization, CORS, most templatesfeature-mvc-application-modelFeatures related to MVC application model, discovery, application partsFeatures related to MVC application model, discovery, application parts