【发布时间】:2013-05-28 18:29:05
【问题描述】:
希望这不是太开放。我正在开发一个.NET 4, WPF, WCF, EF (STE's), SQL 2012 应用程序。
我们受到客户的抨击,因为我们的应用程序在没有太多可用带宽的情况下超时并挂在较慢的网络上。
我们的应用程序有一些类似仪表板的“实时”显示以及一些基于网格的数据编辑器屏幕。
使用 Fiddler,我仔细研究了产品中的不同功能区域 - 特别关注正在传输的数据量。简而言之,传输的数据太多了 - 我们的一些 WCF 调用在一次调用中检索了超过 100 MB 的数据。
我相信我们所看到的问题的特征在于,在通过 WCF 和 EF 检索数据时根本没有采取足够的谨慎措施,但也许我分析得太多了:
我非常喜欢可重复使用性,但为什么要退回完全水合的 当您只需要一个 id 和一个选项列表的名称时,EF STE 实体? 有时,我们只需要对数据进行简单的只读显示。为什么 序列化 ChangeTracker 信息,包括 OriginalValues 收藏等?也许,值得将实体拆分为 可编辑和“只读版本”或选择合适的版本?
现在,我们正在使用 BasicHttpBinding/XML 序列化,但是 有效载荷似乎臃肿。例如,xml 包含命名空间和 一堆其他的噪音。启用 IIS 7 压缩有帮助 剧烈,但我们还能做更多吗? JSON格式会是一个 传输数据的更好选择?将 XML 更改为 JSON 似乎是这样 不过发生了重大变化。
是否有任何其他技术可用于缓解 有效负载大小——也许我们可以坚持使用 XML 序列化,但我们 只需要请求更少的数据。也许使用分页等技术 或“无限滚动”、延迟背景加载等。 不错的选择。
是否有其他人面临过大到无法接受的有效载荷大小?你做了什么来解决它?
谢谢!
【问题讨论】:
-
如果您要求 EF 返回一个对象集合,那么即使您只需要 ID,它也会这样做。
-
是的。但是我们不一定需要序列化完整的对象来提供给客户端。在这些情况下,将其转换为仅包含 Id 和 Name 的简单只读 DTO 会减轻负载。
-
没错。如果您不需要整个对象,则不要要求整个对象。
标签: .net wcf entity-framework serialization