简体   繁体   English

Swashbuckle.AspNetCore-无法为继承基本控制器的控制器生成json

[英]Swashbuckle.AspNetCore - Unable to generate json for controllers that inherit base controllers

I have two controllers that inherit other controllers - for one of them, the swagger doc is generated, for the other it is not. 我有两个继承其他控制器的控制器-对于其中一个,生成了swagger文档,对于另一个则不是。 My controllers are: 我的控制器是:

[Route("Actor")]
public class ActorController : BaseDefControllerLog<Actor> 
 {
        public ActorController(BaseDefController<Actor> baseController, ILogger<ActorController> logger, IAppConfig appSettings) : base(baseController, logger, appSettings)
 { }
  }


[Route("ActorCatalog")]
public class ActorCatalogController: LoggerController, ICatalogController<Actor> 
{
        private readonly BaseDefControllerLog<Actor> _baseController;

        public ActorCatalogController(BaseDefControllerLog<Actor> baseController, ILogger<ActorCatalogController> logger) : base(logger)
        {
            _baseController = baseController;
        }

        [Route("GetAll")]
        [HttpGet]
        public ICollection<Actor> GetAll(int? pageNumber = null, int? pageSize = null)
        {
            //GetAll logic
        }
}

Below, BaseDefController, BaseDefControllerLog and LoggerController: 下面是BaseDefController,BaseDefControllerLog和LoggerController:

public class BaseDefController<T> : Controller, ICatalogController<T> where T : class, IConfigDef
    {
        private readonly IReadManager<T> _manager;

        public BaseDefController(IReadManager<T> manager)
        {
            _manager = manager;
        }
        [HttpGet]
        public virtual ICollection<T> GetAll(int? pageNumber = null, int? pageSize = null)
        {
            return _manager.GetAll(pageNumber, pageSize);
        }
    }


public class BaseDefControllerLog<T>: LoggerController where T : class, IConfigDef
    {
        private readonly BaseDefController<T> _baseController;
        private readonly ILogger<BaseDefControllerLog<T>> _logger;
        public BaseDefControllerLog(BaseDefController<T> baseController, ILogger<BaseDefControllerLog<T>> logger, IAppConfig appSettings) : base(logger)
        {
            _baseController = baseController;
            _logger = logger;
        }

       [HttpGet]
        public virtual ICollection<T> GetAll(string remoteIpAddress = null, int? pageNumber = null, int? pageSize = null)
        {
            //GetAll logic
        }
}



public class LoggerController : Controller
{
        protected ILogger Logger;

        public LoggerController(ILogger logger)
        {
            Logger = logger;
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        { //...  }
        public override void OnActionExecuted(ActionExecutedContext context)
        { //... }
 }

The "Actor" model is a simple class: “演员”模型是一个简单的类:

public class Actor : IConfigDef
    {
        public int Id { get; set; }
        public Guid Tag { get; set; }
        public string Name { get; set; }
        public DateTime LastUpdated { get; set; }
        public bool Deleted { get; set; }
    }

VERSION: 版:

Swashbuckle.AspNetCore 1.0.0 Swashbuckle.AspNetCore 1.0.0

STEPS TO REPRODUCE: 重现步骤:

I have decorated both ActorController and ActorCatalogController with the Route attribute. 我已经用Route属性装饰了ActorController和ActorCatalogController。 At this point, swagger throws an exception when generating the json. 此时,swagger会在生成json时引发异常。 If I remove the route on ActorController and therefore generate documentation only for ActorCatalogController, everything works fine. 如果我删除了ActorController上的路由,因此仅为ActorCatalogController生成文档,那么一切正常。 If I decorate the inherited controllers' actions with route attributes, I also get a 500 response on json. 如果我用route属性装饰继承的控制器的动作,我还将在json上收到500响应。 I also tried to remove the virtual keyword, with no luck. 我也尝试删除虚拟关键字,但是没有运气。

EXPECTED RESULT: 预期结果:

Documentation for both controllers (ActorCatalogController and ActorController). 两种控制器(ActorCatalogController和ActorController)的文档。

ACTUAL RESULT: 实际结果:

500 : http://localhost:4100/swagger/v1/swagger.json The JSON cannot be generated. 500: http:// localhost:4100 / swagger / v1 / swagger.json无法生成JSON。 I catch this exception: "Exception thrown: 'System.NotSupportedException' in Swashbuckle.AspNetCore.SwaggerGen.dll". 我捕获到此异常:“在Swashbuckle.AspNetCore.SwaggerGen.dll中引发了异常:'System.NotSupportedException'”。

ADDITIONAL DETAILS 额外细节

The target framework for my project is .NET framework 4.6.2. 我的项目的目标框架是.NET Framework 4.6.2。 I use Microsoft.AspNetCore 1.1.2 and Microsoft.AspNetCore.Hosting.WindowsServices 1.1.2. 我使用Microsoft.AspNetCore 1.1.2和Microsoft.AspNetCore.Hosting.WindowsServices 1.1.2。 My swagger configuration in Startup.cs is the following: 我在Startup.cs中的敏捷配置如下:

public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddMvc(config =>
                {
                    config.RespectBrowserAcceptHeader = true;
                })
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
                })
                .AddXmlSerializerFormatters();

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info { Title = "InternalServer", Version = "v1" });
            });

            InitializeContainer(services);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseMvc();

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

            LogRegistration(loggerFactory);
        }

我已解决问题,有关解决方法的更多详细信息,请参见: https : //github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/511

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法解析 .net5.0 的“Swashbuckle.AspNetCore (>= 5.6.3)” - Unable to resolve 'Swashbuckle.AspNetCore (>= 5.6.3)' for 'net5.0' 在 Swashbuckle.AspNetCore 中,Swagger JSON 和使用 Results.Ok 时生成的 UI 没有内容类型 - In Swashbuckle.AspNetCore, Swagger JSON and UI generated without content type when Results.Ok is used 可选参数在Swashbuckle.AspNetCore中导致空异常 - Optional parameter causes null exception in Swashbuckle.AspNetCore 迁移到 Swashbuckle.AspNetCore 版本 5 时,Swagger UI 中的不记名身份验证 - Bearer authentication in Swagger UI, when migrating to Swashbuckle.AspNetCore version 5 Swashbuckle.AspNetCore openapi 架构中未正确显示可空属性 - Nullable property is not presented in the Swashbuckle.AspNetCore openapi schema properly 多版本控制 URL 在 Swashbuckle.AspNetCore 5.0.0rc 中不起作用 - Multiple versioning URL not working in Swashbuckle.AspNetCore 5.0.0rc Swashbuckle.AspNetCore (5.0.0-rc5) 忽略公共字段 - Swashbuckle.AspNetCore (5.0.0-rc5) ignoring public fields 如何使用Swashbuckle.AspNetCore隐藏响应代码200? - How can I hide response code 200 with Swashbuckle.AspNetCore? swashbuckle.aspnetcore 是否支持 asp.net core 3.0? - Is swashbuckle.aspnetcore supporting asp.net core 3.0? Swashbuckle.AspNetCore是否支持FluentValidation而不是DataAnnotations? - Does Swashbuckle.AspNetCore support FluentValidation instead of DataAnnotations?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM