Created
September 15, 2018 11:50
-
-
Save hakant/9c4ade5aa240f3aa245e5becabbbc2d2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace Microsoft.Examples | |
{ | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.IO; | |
using System.Reflection; | |
using System.Threading.Tasks; | |
using Microsoft.AspNetCore.Builder; | |
using Microsoft.AspNetCore.Hosting; | |
using Microsoft.AspNetCore.HttpsPolicy; | |
using Microsoft.AspNetCore.Mvc; | |
using Microsoft.Extensions.Configuration; | |
using Microsoft.Extensions.DependencyInjection; | |
using Microsoft.Extensions.Logging; | |
using Microsoft.Extensions.Options; | |
using Microsoft.AspNetCore.Mvc.ApiExplorer; | |
using Swashbuckle.AspNetCore.Swagger; | |
/// <summary> | |
/// Represents the startup process for the application. | |
/// </summary> | |
public class Startup | |
{ | |
/// <summary> | |
/// Initializes a new instance of the <see cref="Startup"/> class. | |
/// </summary> | |
/// <param name="env">The current hosting environment.</param> | |
public Startup(IHostingEnvironment env) | |
{ | |
var builder = new ConfigurationBuilder() | |
.SetBasePath(env.ContentRootPath) | |
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) | |
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) | |
.AddEnvironmentVariables(); | |
Configuration = builder.Build(); | |
} | |
/// <summary> | |
/// Gets the current configuration. | |
/// </summary> | |
/// <value>The current application configuration.</value> | |
public IConfigurationRoot Configuration { get; } | |
/// <summary> | |
/// Configures services for the application. | |
/// </summary> | |
/// <param name="services">The collection of services to configure the application with.</param> | |
public void ConfigureServices(IServiceCollection services) | |
{ | |
// add the versioned api explorer, which also adds IApiVersionDescriptionProvider service | |
// note: the specified format code will format the version as "'v'major[.minor][-status]" | |
services.AddMvcCore().AddVersionedApiExplorer( | |
options => | |
{ | |
options.GroupNameFormat = "'v'VVV"; | |
// note: this option is only necessary when versioning by url segment. the SubstitutionFormat | |
// can also be used to control the format of the API version in route templates | |
options.SubstituteApiVersionInUrl = true; | |
}); | |
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); | |
services.AddApiVersioning(o => o.ReportApiVersions = true); | |
services.AddSwaggerGen( | |
options => | |
{ | |
// resolve the IApiVersionDescriptionProvider service | |
// note: that we have to build a temporary service provider here because one has not been created yet | |
var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>(); | |
// add a swagger document for each discovered API version | |
// note: you might choose to skip or document deprecated API versions differently | |
foreach (var description in provider.ApiVersionDescriptions) | |
{ | |
options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description)); | |
} | |
// add a custom operation filter which sets default values | |
options.OperationFilter<SwaggerDefaultValues>(); | |
// integrate xml comments | |
options.IncludeXmlComments(XmlCommentsFilePath); | |
}); | |
} | |
/// <summary> | |
/// Configures the application using the provided builder, hosting environment, and logging factory. | |
/// </summary> | |
/// <param name="app">The current application builder.</param> | |
/// <param name="env">The current hosting environment.</param> | |
/// <param name="loggerFactory">The logging factory used for instrumentation.</param> | |
/// <param name="provider">The API version descriptor provider used to enumerate defined API versions.</param> | |
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApiVersionDescriptionProvider provider) | |
{ | |
loggerFactory.AddConsole(Configuration.GetSection("Logging")); | |
loggerFactory.AddDebug(); | |
if (env.IsDevelopment()) | |
{ | |
app.UseDeveloperExceptionPage(); | |
} | |
else | |
{ | |
app.UseExceptionHandler("/Error"); | |
//app.UseHsts(); | |
} | |
//app.UseHttpsRedirection(); | |
app.UseStaticFiles(); | |
app.UseCookiePolicy(); | |
app.UseMvc(); | |
app.UseSwagger(); | |
app.UseSwaggerUI( | |
options => | |
{ | |
// build a swagger endpoint for each discovered API version | |
foreach (var description in provider.ApiVersionDescriptions) | |
{ | |
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); | |
} | |
}); | |
} | |
static string XmlCommentsFilePath | |
{ | |
get | |
{ | |
var basePath = AppContext.BaseDirectory; | |
var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml"; | |
return Path.Combine(basePath, fileName); | |
} | |
} | |
static Info CreateInfoForApiVersion(ApiVersionDescription description) | |
{ | |
var info = new Info() | |
{ | |
Title = $"Sample API {description.ApiVersion}", | |
Version = description.ApiVersion.ToString(), | |
Description = "A sample application with Swagger, Swashbuckle, and API versioning." | |
}; | |
if (description.IsDeprecated) | |
{ | |
info.Description += " This API version has been deprecated."; | |
} | |
return info; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment