首页 文章

swagger无法找到从ASP NET CORE项目中的程序集加载的控制器

提问于
浏览
0

我有一个asp .net核心控制台项目,它使用ApplicationPart加载API程序集 . 我需要添加swagger以暴露API,但是当我将Swashbuckle安装到控制台项目并在启动类中配置Swagger时,如果我导航到swagger ui,则无法找到任何内容 . 它返回401错误 .

在ConfigureServices方法中:

services.AddMvc
.AddApplicationPart(WebApi.GetAssembly()).AddControllersAsServices();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1"});
});

在Configure方法中:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

我可以很好地调用控制器上的动作,但似乎Swashbuckle没有为它生成任何Swagger . 我错过了什么或者它还没有支持吗?任何建议将不胜感激!

2 回答

  • 0

    我将Nswag用于我的所有项目 . 我对Swashbuckle没有多少经验,但它们都有类似的用途 . 我正在提供一种配置Nswag的方法 .

    将NSwag.AspNetCore nuget包添加到您的项目中,并在启动类中添加以下代码:

    app.UseSwaggerUi(typeof(Startup).GetTypeInfo().Assembly, settings =>
    {
        settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
    
        settings.PostProcess = document =>
        {
            document.Info.Version = "v1";
            document.Info.Title = "RestAPI";
        };
    });
    
  • 0

    虽然我没有使用Swagger,但在我的上下文中我遇到了类似的问题,所以我确保手动加载控制器:

    public void ConfigureServices(IServiceCollection Services)
        {
            // find all controllers
            var Controllers =
                from a in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
                from t in a.GetTypes()
                let attributes = t.GetCustomAttributes(typeof(ControllerAttribute), true)
                where attributes?.Length > 0
                select new { Type = t };
    
            var ControllersList = Controllers.ToList();
            Logging.Info($"Found {ControllersList.Count} controllers");
    
            // register them
            foreach (var Controller in ControllersList)
            {
                Logging.Info($"[Controller] Registering {Controller.Type.Name}");
                Services
                    .AddMvc()
                    .AddJsonOptions(Options => Options.SerializerSettings.ContractResolver = new DefaultContractResolver())
                    .AddApplicationPart(Controller.Type.Assembly);
            }
    

    在init中,控制器可以正确添加和初始化

相关问题