Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Swigger IEnumerable<;T>;_C#_Asp.net_Rest_Swagger - Fatal编程技术网

C# ASP.NET Swigger IEnumerable<;T>;

C# ASP.NET Swigger IEnumerable<;T>;,c#,asp.net,rest,swagger,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() { ret

在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和/或NSwag不能很好地处理泛型List/IList/IEnumerable类型作为基类型,可能是因为一些试图与Swagger连接的框架不理解它们

我通过将列表包装到另一个对象中解决了这个问题。因此,在您的情况下,您可能需要执行以下操作:

public ListResponseObject<T>()
{
    public IEnumerable<T> ResponseList {get; set;}
}
公共列表响应对象()
{
公共IEnumerable责任列表{get;set;}
}
然后从控制器返回,如下所示:

public ListResponseObject<Device> Get()
{
    return new ListResponseObject<Device>{ResponseList = new List<Device>()};
}
public ListResponseObject Get()
{
返回新的ListResponseObject{ResponseList=new List()};
}
不是那么简单。。。但我们应该更好地通过招摇过市

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

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


public ResponseObject<T>()
{
    public string Message {get; set;}
    public string Status {get; set;}
}
public ListResponseObject():ResponseObject
{
公共IEnumerable责任列表{get;set;}
}
公共响应对象()
{
公共字符串消息{get;set;}
公共字符串状态{get;set;}
}
现在你有了一个容器,可以让下游的处理更容易一些

不是一个确切的答案,而是一个对我们有用的解决方案。YMMV

更新:以下是对我在NSwag GitHub上发布的一个问题的回复:

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

计划对支持泛型进行增强,但这将不符合swagger的要求,只适用于nswag。。。(在swagger ui中不支持)

在C#Asp.Net web api中,我这样做:

1-在SwaggerConfig.cs中

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

我是从

中得到这个想法的。你能举例说明它应该如何显示吗?或者,您可以尝试使用
ResponseTypeAttribute
指定响应类型,并检查它是否更改其显示方式。应该类似于:[Device]Device{Id(string,可选)、ConnectionString(string,可选)、ConnectionState(string,可选)}我试图用一个新创建的WebAPI项目和安装的swagger重现您的问题,结果与预期的一样。你能发布你的招摇配置吗?您还可以告诉我设备是由您定义的还是来自另一个程序集吗?公共类SwaggerConfig{public static void Register(){var thissembly=typeof(SwaggerConfig).assembly;GlobalConfiguration.Configuration.EnableSwagger(c=>{c.SingleApiVersion(“v1”,“api”);})。EnableSwaggerUi(c=>{};}}}公共类设备{公共字符串Id{get;set;}公共字符串连接字符串{get;set;}公共字符串连接状态{get;set;}}}那么,以前没有其他人尝试过以虚张声势返回IEnumerable或IList吗?
              .EnableSwagger(c =>
                {//add this line
                 c.SchemaFilter<ApplyModelNameFilter>();
                }                      
class ApplyModelNameFilter : ISchemaFilter
{
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
    {     
        schema.title = type.Name;
    }
}