diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Controllers/WeatherForecastController.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000000..09980bc234 --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Controllers/WeatherForecastController.cs @@ -0,0 +1,65 @@ +using Microsoft.AspNetCore.Mvc; + +namespace HideEndpointInOpenApi.Controllers; + +[ApiController] +[Route("[controller]")] +public class WeatherForecastController : ControllerBase +{ + private static readonly string[] Summaries = + [ + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching" + ]; + + [HttpGet("GetWeatherForecast")] + public IEnumerable Get() + { + return GetWeatherForecastData(); + } + + [HttpGet("GetMethodOne")] + [NonAction] + public IEnumerable GetMethodOne() + { + return GetWeatherForecastData(); + } + + [HttpGet("GetMethodTwo")] + [ApiExplorerSettings(IgnoreApi = true)] + public IEnumerable GetMethodTwo() + { + return GetWeatherForecastData(); + } + + [HttpGet("GetMethodThree")] + public IEnumerable GetMethodThree() + { + return GetWeatherForecastData(); + } + + [HttpGet("GetMethodFour")] + public IEnumerable GetMethodFour() + { + return GetWeatherForecastData(); + } + + private IEnumerable GetWeatherForecastData() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Conventions/HideActionConvention.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Conventions/HideActionConvention.cs new file mode 100644 index 0000000000..c4602183af --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Conventions/HideActionConvention.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Mvc.ApplicationModels; + +namespace HideEndpointInOpenApi.Conventions; + +public class HideActionConvention : IActionModelConvention +{ + public void Apply(ActionModel action) + { + if (action.ActionName == "GetMethodThree") + { + action.ApiExplorer.IsVisible = false; + } + } +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/HideEndpointInOpenApi.csproj b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/HideEndpointInOpenApi.csproj new file mode 100644 index 0000000000..0268d75ddb --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/HideEndpointInOpenApi.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + enable + enable + + + + + + + diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Program.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Program.cs new file mode 100644 index 0000000000..51ec9151e4 --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Program.cs @@ -0,0 +1,31 @@ +using HideEndpointInOpenApi.Conventions; +using HideEndpointInOpenApi.Transformers; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(s => + s.Conventions.Add(new HideActionConvention() + )); + +builder.Services.AddOpenApi(options => +{ + options.ShouldInclude = apiDesc => apiDesc.RelativePath != "WeatherForecast/GetWeatherForecast"; + options.AddDocumentTransformer(); +}); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.MapOpenApi(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.MapGet("/internal", () => "internal").ExcludeFromDescription(); + +app.Run(); diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Transformers/HideEndpointDocumentTransformer.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Transformers/HideEndpointDocumentTransformer.cs new file mode 100644 index 0000000000..458f00ea79 --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/Transformers/HideEndpointDocumentTransformer.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.OpenApi; +using Microsoft.OpenApi; + +namespace HideEndpointInOpenApi.Transformers; + +public class HideEndpointDocumentTransformer : IOpenApiDocumentTransformer +{ + public Task TransformAsync(OpenApiDocument document, + OpenApiDocumentTransformerContext context, + CancellationToken cancellationToken) + { + document.Paths.Remove("/WeatherForecast/GetMethodFour"); + + return Task.CompletedTask; + } +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/WeatherForecast.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/WeatherForecast.cs new file mode 100644 index 0000000000..bb216ede07 --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/WeatherForecast.cs @@ -0,0 +1,12 @@ +namespace HideEndpointInOpenApi; + +public class WeatherForecast +{ + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.Development.json b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.Development.json new file mode 100644 index 0000000000..0c208ae918 --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.json b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.json new file mode 100644 index 0000000000..10f68b8c8b --- /dev/null +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInOpenApi/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger.sln b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger.sln index 8ac828a76e..1b08471706 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger.sln +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HideEndpointInSwagger", "Hi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HideEndpointInSwaggerTests", "HideEndpointInSwaggerTests\HideEndpointInSwaggerTests.csproj", "{997C22B1-9AA6-44C1-82F0-96A9FB3DD6E5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HideEndpointInOpenApi", "HideEndpointInOpenApi\HideEndpointInOpenApi.csproj", "{6B2FE7B7-D288-4F8C-85D3-2F0E8906B397}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {997C22B1-9AA6-44C1-82F0-96A9FB3DD6E5}.Debug|Any CPU.Build.0 = Debug|Any CPU {997C22B1-9AA6-44C1-82F0-96A9FB3DD6E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {997C22B1-9AA6-44C1-82F0-96A9FB3DD6E5}.Release|Any CPU.Build.0 = Release|Any CPU + {6B2FE7B7-D288-4F8C-85D3-2F0E8906B397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B2FE7B7-D288-4F8C-85D3-2F0E8906B397}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B2FE7B7-D288-4F8C-85D3-2F0E8906B397}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B2FE7B7-D288-4F8C-85D3-2F0E8906B397}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Controllers/WeatherForecastController.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Controllers/WeatherForecastController.cs index 693072c10b..fd9ecf7a43 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Controllers/WeatherForecastController.cs +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Controllers/WeatherForecastController.cs @@ -7,7 +7,7 @@ namespace HideEndpointInSwagger.Controllers; public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = - { + [ "Freezing", "Bracing", "Chilly", @@ -18,7 +18,7 @@ public class WeatherForecastController : ControllerBase "Hot", "Sweltering", "Scorching" - }; + ]; [HttpGet("GetWeatherForecast")] public IEnumerable Get() diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Filters/SwaggerDocumentFilter.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Filters/SwaggerDocumentFilter.cs index a6bcb5e026..7d1b619b1a 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Filters/SwaggerDocumentFilter.cs +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Filters/SwaggerDocumentFilter.cs @@ -1,4 +1,4 @@ -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; using Swashbuckle.AspNetCore.SwaggerGen; namespace HideEndpointInSwagger.Filters; diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/HideEndpointInSwagger.csproj b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/HideEndpointInSwagger.csproj index 0dd093e992..dcaa0a0b03 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/HideEndpointInSwagger.csproj +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/HideEndpointInSwagger.csproj @@ -1,14 +1,14 @@ - net7.0 + net10.0 enable enable - - + + diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Program.cs b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Program.cs index 6b6447fae2..61f27649a3 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Program.cs +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwagger/Program.cs @@ -1,51 +1,41 @@ using HideEndpointInSwagger.Conventions; using HideEndpointInSwagger.Filters; -namespace HideEndpointInSwagger; +var builder = WebApplication.CreateBuilder(args); -public class Program +// Add services to the container. +builder.Services.AddControllers(s => + s.Conventions.Add(new HideControllerConvention() + )); + +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddSwaggerGen(c => { - public static void Main(string[] args) + c.DocumentFilter(); + c.DocInclusionPredicate((docName, apiDesc) => { - var builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddControllers(s => - s.Conventions.Add(new HideControllerConvention() - )); - - // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle - builder.Services.AddEndpointsApiExplorer(); + var routeTemplate = apiDesc.RelativePath; - builder.Services.AddSwaggerGen(c => - { - c.DocumentFilter(); - c.DocInclusionPredicate((docName, apiDesc) => - { - var routeTemplate = apiDesc.RelativePath; + if (routeTemplate == "WeatherForecast/GetWeatherForecast") + return false; - if (routeTemplate == "WeatherForecast/GetWeatherForecast") - return false; + return true; + }); +}); - return true; - }); - }); +var app = builder.Build(); - var app = builder.Build(); - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseSwagger(); - app.UseSwaggerUI(); - } +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} - app.UseHttpsRedirection(); +app.UseHttpsRedirection(); - app.UseAuthorization(); +app.UseAuthorization(); - app.MapControllers(); +app.MapControllers(); - app.Run(); - } -} \ No newline at end of file +app.Run(); diff --git a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwaggerTests/HideEndpointInSwaggerTests.csproj b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwaggerTests/HideEndpointInSwaggerTests.csproj index 5d73666fae..42de7059b9 100644 --- a/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwaggerTests/HideEndpointInSwaggerTests.csproj +++ b/aspnetcore-webapi/HideEndpointInSwagger/HideEndpointInSwaggerTests/HideEndpointInSwaggerTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all