在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; }
}
答案 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那里得到了主意