Open
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.