ASP.NET Swagger IEnumerable <t>

时间:2016-09-19 12:18:16

标签: c# asp.net rest swagger

在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; } 
}

2 个答案:

答案 0 :(得分:3)

似乎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>()};
}

不那么简单......但应该更好地通过Swagger。

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

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

更新: 以下是对我在NSwag GitHub中发布的问题的回复issues

  

我认为它是正确的。目前,swagger和json模式不支持泛型(仅适用于数组),因此所有泛型类型都扩展为非泛型/特定类型......尽管模型应该是正确的,但最终可能会有很多类... < / p>

计划对支持泛型进行增强,但这不符合招摇,只能与nswag一起使用...(不支持swagger ui)

答案 1 :(得分:1)

在C#Asp.Net Web API中,我这样做:

1-在SwaggerConfig.cs中

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

2-添加一个实现ISchemaFilter的类:

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

我从here那里得到了主意