You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 3.1 Swagger报No operations defined in spec不显示控制器

ASP.NET Core 3.1集成Swagger提示“No operations defined in spec!”无法显示接口

我在使用ASP.NET Core 3.1集成Swagger时,界面提示“No operations defined in spec!”,无法正常显示控制器下的接口。我尝试查阅了多个相关解决方案,都没能解决问题。

Startup.cs文件代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddCommonService(Configuration);
    services.AddSecurityServiceRepositories();
    services.AddSwaggerService();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSwaggerService();
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseStaticFiles();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    //app.UseMvc();
}

仓储注册服务类代码

namespace Microsoft.Extensions.DependencyInjection
{
    public static class SecurityServiceRepositoryCollectionExtension
    {
        public static IServiceCollection AddSecurityServiceRepositories(this IServiceCollection services)
        {
            services.AddTransient<IUserRepository, UserRepository>();
            return services;
        }
    }
}

Swagger服务扩展类代码

namespace Microsoft.Extensions.DependencyInjection
{
    public static class SwaggerServiceExtension
    {
        public static IServiceCollection AddSwaggerService(this IServiceCollection services)
        {
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "Sample API",
                    Version = "v1",
                    Description = "REST API for Sample "
                });
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = @"JWT Authorization header using the Bearer scheme. \r\n\r
                      Enter 'Bearer' [space] and then your token in the text input below.
                      \r\n\r
Example: 'Bearer 12345abcdef'",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    Scheme = "Bearer"
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement()
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Bearer"
                            },
                            Scheme = "oauth2",
                            Name = "Bearer",
                            In = ParameterLocation.Header
                        },
                        new List<string>()
                    }
                });
            });
            return services;
        }
        public static IApplicationBuilder UseSwaggerService(this IApplicationBuilder app)
        {
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sample  Api V1");
            });

            return app;
        }
    }
}

控制器代码

[Route("api/[controller]")]
[ApiController]
public class UserController : SecuredRepositoryController<IUserRepository>
{
    public UserController(IUserRepository repository) : base(repository) { }

    [HttpPost("register-user")]
    // [Route("register-user")] 我也试过该路由配置
    [AllowAnonymous]
    [ProducesResponseType(typeof(User), 200)]
    public async Task<IActionResult> AddNewUser([FromBody] User user)
    {
        try
        {
            var result = await this.Repository.RegisterUser(user);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, ex.Message);
        }
    }
}

当前故障表现

Swagger UI显示效果如下,未加载出控制器接口:
Swagger界面截图


故障排查与解决方案

按优先级依次检查调整即可:

  • 中间件顺序错误
    你当前将UseSwaggerService放在了配置最开头,正确的顺序必须放在UseRouting之后、UseAuthorization之前,修改Configure方法的顺序:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    // Swagger中间件移到此处
    app.UseSwaggerService();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
  • 基类控制器配置问题
    检查你继承的SecuredRepositoryController基类是否为public修饰符、是否正确继承了ControllerBase,如果基类是内部类、或者没有正确继承Controller基类,会导致Swagger无法识别控制器。
  • SwaggerGen遗漏XML扫描配置
    如果你项目开启了XML文档文件生成,需要在AddSwaggerGen中添加XML读取配置,否则部分场景下Swagger会扫描不到接口:
// 在AddSwaggerGen的options配置块中添加
var xmlFile = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath, true);

同时右键项目→属性→生成,勾选「XML文档文件」,输出路径填写对应运行时版本的输出目录即可。

  • 路由与特性冲突检查
    确认你的项目没有全局路由前缀覆盖了控制器的路由配置,也没有[NonAction]、[ApiExplorerSettings(IgnoreApi = true)]这类忽略接口的特性标记在控制器或Action上。

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:06:03