【问题标题】:Swashbuckle very slow for large schema对于大型架构,Swashbuckle 非常慢
【发布时间】:2018-04-27 20:43:54
【问题描述】:

我有一个包含 90 多个表的数据库,这些表都通过外键相互交叉链接。

当我打开我的 API 的 swagger 页面时,加载需要 2 多分钟。原因似乎是它为每个 API 生成 ModelExample Value。由于交叉链接,几乎每个实体都引用了所有其他实体(通过递归传递闭包)!

当swagger生成ModelExample Value时,有没有办法禁用或限制递归?

例如,

class A {
   int id;
   List<B> Blist;
}

class B {
   int id;
   List<C> Clist;
}

class C {
   int id;
   List<D> Dlist;
}

/// etc...

如果我有一个用于GET /api/A 的 API,那么我不想将所有类都拉到 swagger 页面 Model 中。太大了!!我只想拉A。

【问题讨论】:

  • 您使用的是哪个 version of Swagger UI 和 Swashbuckle?您可以尝试在最新版本的 Swagger UI 中加载您的规范,看看是否性能更好?您的 API 定义文件 (YAML/JSON) 有多大?
  • 使用 Swashbuckle 5.6.0 和 Swagger-UI 2.0 -- 我认为。

标签: c# .net swagger swashbuckle


【解决方案1】:

你的问题的答案很简短

swagger生成Model和Example时有什么办法限制递归?

很遗憾没有!

目前没有这样的选择。但这是可能的,我们正在讨论它:
https://github.com/swagger-api/swagger-ui/issues/4411
在此处添加评论并 +1 该问题,让团队知道这对您很重要。

Swagger-UI 不能很好地处理复杂的模式,有时只是速度很慢,有时会导致浏览器崩溃,团队知道,希望我们能尽快得到修复。

现在不再支持您的版本 (2.x),因此不会有修复...
你试过Swagger-Net吗?那是我的 fork,我正在使用最新版本的 UI

【讨论】:

    【解决方案2】:

    这是一个似乎可以“修复”它的 hack。我将此添加到我的SwaggerConfig.cs

      c.MapType<MasterModel>(() => new Schema { type = "integer", format = "int32" });
      c.MapType<MasterLocationModel>(() => new Schema { type = "integer", format = "int32" });
      c.MapType<LocationModel>(() => new Schema { type = "integer", format = "int32" });
    

    我有更多类型,但这三个是中心类型,因此通过将它们映射到整数,可以将递归限制在合理的水平。它也使招摇页面错误,但至少它加载!

    也许有一种方法可以更好地使用SchemaFilter?任何帮助将不胜感激。

    编辑:

    最后,我们决定拆分我们的类,这样 swagger 就不能看到超过一层的引用。例如,

    class A_Base {
       int id;
    }
    
    class A : A_Base {
       List<B_Base> Blist;
    }
    
    class B_Base {
       int id;
    }
    
    class B : B_Base {
       List<C_Base> Clist;
    }
    
    class C_Base {
       int id;
    }
    
    class C : C_Base {
       List<D_Base> Dlist;
    }
    

    我们所有的控制器 API 都使用 A、B、C 类型。swagger 文档只会深入一层。递归并没有完全失控。它也更正确,因为我们的 API 返回的对象通常只有零或一级深度。

    【讨论】:

    • 这个答案对您来说可能有意义,但任何阅读您问题的人都会想知道这些模型(MasterModelMasterLocationModelLocationModel)来自哪里?
    • 还要记住,生成的 swagger 架构不仅被 UI 使用,还有一些工具可以使用它并生成代码以与您的 api (swagger.io/swagger-codegen) 通信,所以如果您的模型不正确生成的代码不好。
    • 这个答案帮助我解决了同样的问题。如果您有一个庞大的数据模型,则使用此解决方法可以解决问题。我可以建议将此技术用于具有循环引用的实体。
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多