Asp.net core 使用aspnet api版本控制时无法创建swagger.json文件

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]")]

我有.NETCore2.2应用程序。我正在尝试使用nugetpackage设置具有不同版本的API。我遵循了存储库中提供的

我想使用基于定义控制器名称空间名称的API版本

项目结构

控制器

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]
属性