ASP.NET Swagger IEnumerable<T>

本文关键字:gt NET lt IEnumerable ASP Swagger | 更新日期: 2023-09-27 18:07:54

在Swagger UI中,我得到了如下模型:

Inline Model [
    Inline Model 1
]
Inline Model 1 {
    Id (string, optional),
    ConnectionString (string, optional),
    ConnectionState (string, optional)
}

用于REST Get方法,如:

public IEnumerable<Device> Get()
{
    return new List<Device>();
}

为什么不能正确显示?

从注释中添加Swagger配置

public class SwaggerConfig 
{ 
    public static void Register() 
    { 
        var thisAssembly = typeof(SwaggerConfig).Assembly; 
        GlobalConfiguration.Configuration .EnableSwagger(c => { c.SingleApiVersion("v1", "api"); }) .EnableSwaggerUi(c => { }); 
    } 
} 
public class Device 
{ 
    public string Id { get; set; } 
    public string ConnectionString { get; set; } 
    public string ConnectionState { get; set; } 
}

ASP.NET Swagger IEnumerable<T>

. Net web api,我这样做:

1-在SwaggerConfig.cs

              .EnableSwagger(c =>
                {//add this line
                 c.SchemaFilter<ApplyModelNameFilter>();
                }                      

2-添加一个类来实现缺血过滤器:

class ApplyModelNameFilter : ISchemaFilter
{
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
    {     
        schema.title = type.Name;
    }
}

我从这里得到了这个想法

似乎Swagger和/或NSwag不能很好地处理Generic List/IList/IEnumerable类型作为基本类型,可能是因为一些试图与Swagger连接的框架不理解它们。

我通过将List包装在另一个对象中来解决这个问题。因此,在您的情况下,您可能需要这样做:

public ListResponseObject<T>()
{
    public IEnumerable<T> ResponseList {get; set;}
}

然后像这样从控制器返回:

public ListResponseObject<Device> Get()
{
    return new ListResponseObject<Device>{ResponseList = new List<Device>()};
}

不那么简单…但应该能更好地通过斯威格。

我们已经利用了这一点。我们已经将这种技术应用于所有的控制器(或类似的东西),所以我们有一个更标准化的响应。我们还可以这样做:

public ListResponseObject<T>() : ResponseObject<T>
{
    public IEnumerable<T> ResponseList {get; set;}
}

public ResponseObject<T>()
{
    public string Message {get; set;}
    public string Status {get; set;}
}

现在你有一个容器,这将使下游处理更容易。

不是一个确切的答案,但是一个对我们有用的变通方法。YMMV

UPDATE:这是对我在NSwag GitHub问题中发布的问题的回答:

我认为这是正确的。目前swagger和json模式不支持泛型(仅对数组),因此所有泛型类型都扩展为非泛型/特定类型…虽然模型应该是正确的,但你最终可能会有很多类…

计划增强对泛型的支持,但这将不符合swagger,只适用于nswag…(不支持swagger ui)