Asp.net core 使用aspnet api版本控制时无法创建swagger.json文件
我有.NETCore2.2应用程序。我正在尝试使用nugetpackage设置具有不同版本的API。我遵循了存储库中提供的 我想使用基于定义控制器名称空间名称的API版本 项目结构Asp.net core 使用aspnet api版本控制时无法创建swagger.json文件,asp.net-core,.net-core,asp.net-core-2.0,asp.net-core-webapi,swashbuckle,Asp.net Core,.net Core,Asp.net Core 2.0,Asp.net Core Webapi,Swashbuckle,我有.NETCore2.2应用程序。我正在尝试使用nugetpackage设置具有不同版本的API。我遵循了存储库中提供的 我想使用基于定义控制器名称空间名称的API版本 项目结构 控制器 namespace NetCoreApiVersioning.V1.Controllers { [ApiController] [Route("[controller]")] [Route("v{version:apiVersion}/[controller]")]
控制器
namespace NetCoreApiVersioning.V1.Controllers
{
[ApiController]
[Route("[controller]")]
[Route("v{version:apiVersion}/[controller]")]
public class HelloWorldController : ControllerBase
{
public IActionResult Get()
{
return Ok();
}
}
}
namespace NetCoreApiVersioning.V2.Controllers
{
[ApiController]
[Route("[controller]")]
[Route("v{version:apiVersion}/[controller]")]
public class HelloWorldController : ControllerBase
{
public IActionResult Get()
{
return Ok();
}
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddApiVersioning(
options =>
{
// reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
options.ReportApiVersions = true;
// automatically applies an api version based on the name of the defining controller's namespace
options.Conventions.Add(new VersionByNamespaceConvention());
});
services.AddVersionedApiExplorer(
options =>
{
// add the versioned api explorer, which also adds IApiVersionDescriptionProvider service
// note: the specified format code will format the version as "'v'major[.minor][-status]"
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.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "API v1 ", Version = "v1" });
c.SwaggerDoc("v2", new Info { Title = "API v2", Version = "v2" });
});
// commented code below is from
// https://github.com/microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerSample
//services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
//services.AddSwaggerGen(
// options =>
// {
// // add a custom operation filter which sets default values
// //options.OperationFilter<SwaggerDefaultValues>();
// // integrate xml comments
// //options.IncludeXmlComments(XmlCommentsFilePath);
// });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)
{
// remaining configuration omitted for brevity
// Enable middleware to serve generated Swagger as a JSON endpoint.
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());
}
});
app.UseMvc();
}
}
注意:控制器没有[ApiVersion]
属性,因为我希望版本控制由名称空间定义
Startup.cs
namespace NetCoreApiVersioning.V1.Controllers
{
[ApiController]
[Route("[controller]")]
[Route("v{version:apiVersion}/[controller]")]
public class HelloWorldController : ControllerBase
{
public IActionResult Get()
{
return Ok();
}
}
}
namespace NetCoreApiVersioning.V2.Controllers
{
[ApiController]
[Route("[controller]")]
[Route("v{version:apiVersion}/[controller]")]
public class HelloWorldController : ControllerBase
{
public IActionResult Get()
{
return Ok();
}
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddApiVersioning(
options =>
{
// reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
options.ReportApiVersions = true;
// automatically applies an api version based on the name of the defining controller's namespace
options.Conventions.Add(new VersionByNamespaceConvention());
});
services.AddVersionedApiExplorer(
options =>
{
// add the versioned api explorer, which also adds IApiVersionDescriptionProvider service
// note: the specified format code will format the version as "'v'major[.minor][-status]"
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.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "API v1 ", Version = "v1" });
c.SwaggerDoc("v2", new Info { Title = "API v2", Version = "v2" });
});
// commented code below is from
// https://github.com/microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerSample
//services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
//services.AddSwaggerGen(
// options =>
// {
// // add a custom operation filter which sets default values
// //options.OperationFilter<SwaggerDefaultValues>();
// // integrate xml comments
// //options.IncludeXmlComments(XmlCommentsFilePath);
// });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)
{
// remaining configuration omitted for brevity
// Enable middleware to serve generated Swagger as a JSON endpoint.
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());
}
});
app.UseMvc();
}
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.addapVersioning(
选项=>
{
//报告api版本将返回标题“api支持的版本”和“api不推荐的版本”
options.ReportApiVersions=true;
//根据定义控制器命名空间的名称自动应用api版本
添加(新版本ByNamespaceConvention());
});
services.AddVersionedApiExplorer(
选项=>
{
//添加版本化api资源管理器,它还添加了IApiVersionDescriptionProvider服务
//注意:指定的格式代码将版本格式设置为“'v'major[.minor][状态]”
options.GroupNameFormat=“'v'VVV”;
//注意:仅当按url段进行版本控制时,此选项才是必需的
//也可用于控制路由模板中API版本的格式
options.substituteApprovisionInUrl=true;
});
services.AddSwaggerGen(c=>
{
c、 大摇大摆的文档(“v1”,新信息{Title=“API v1”,Version=“v1”});
c、 虚张声势的文件(“v2”,新信息{Title=“API v2”,Version=“v2”});
});
//下面的注释代码来自
// https://github.com/microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerSample
//services.AddTransient();
//services.addswagggen(
//选项=>
// {
////添加设置默认值的自定义操作筛选器
////options.OperationFilter();
////集成xml注释
////options.includexmlcoments(xmlcomentsfilepath);
// });
}
public void Configure(IAApplicationBuilder应用程序、IHostingEnvironment环境、IApiVersionDescriptionProvider提供程序)
{
//为简洁起见,省略了其余配置
//使中间件能够将生成的Swagger作为JSON端点提供服务。
app.UseSwagger();
app.UseSwaggerUI(
选项=>
{
//为每个发现的API版本构建一个招摇过市的端点
foreach(provider.ApiVersionDescriptions中的变量描述)
{
options.SwaggerEndpoint($“/swagger/{description.GroupName}/swagger.json”,description.GroupName.ToUpperInvariant());
}
});
app.UseMvc();
}
}
问题它无法生成swagger.json文件。当我浏览url
/swagger
时,我看到错误未定义/swagger/v1/swagger.json
已找到。。
我在找到的ActionMethods中缺少[HttpGet]
属性。。
ActionMethods中缺少[HttpGet]
属性