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; }
}
. 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)