传递需要的大量 Json 对象时如何改进 Asp.net Mvc 应用程序?

Posted

技术标签:

【中文标题】传递需要的大量 Json 对象时如何改进 Asp.net Mvc 应用程序?【英文标题】:How to improve Asp.net Mvc Application when passing a large chunk of Json object needed? 【发布时间】:2016-03-04 13:58:29 【问题描述】:

我目前正在开发一个报告应用程序来比较多个测试。我需要将一个 json 对象从控制器传递到客户端来为报告绘制所有这些图表。我在此处附上仅比较 2 个测试时得到的结果图像。传递的数据约为 600kb,时间约为 3 秒。 这是我在控制器中使用的代码:

var jsonResult = Json(new

  ReportData = reportData
, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = Int32.MaxValue;
return jsonResult;

如何提高应用程序的性能?非常感谢任何建议。

Ps:如果我的问题不适合这里的标准,请告诉我,以便我进行调整。对于所有投反对票的人,请发表评论,以便我下次改进。谢谢吨

【问题讨论】:

您必须问自己,是否需要所有这些数据?可能需要一个更苗条且可能不太冗长的 DTO。 我必须传递这么多数据。您的评论根本没有帮助 @MinhNguyen 在这种情况下可能没有帮助,但这绝对是一个有效的问题。也许您应该在问题中指出,所有数据都是必需的,并且不能遗漏任何数据。 即使你说你不能从 json 中删除任何属性,因为你需要它,但这仍然没有考虑到削减属性名称。比如MyObjectBusinessLevelHandlerName的80个实例可以切到moblhName,节省不少字节……说不能全盘减少数据包可能是错误的。 【参考方案1】:

您应该在这 3 秒内向下钻取,以确定他们丢失的确切位置。这里发生了很多事情:

    您正在从某个地方构建这个 reportData 变量 - 测量需要多长时间 您正在将此 reportData 变量序列化为 JSON - 测量需要多长时间

完成这些测量后,您就会知道需要/可以优化的地方。如果事实证明 3 秒中有 2.9 秒在 1 秒中丢失了,那么您绝对应该改进查询数据的方式或优化您的数据存储(假设您到目前为止提供的信息是相当困难和主观的事情) .也许您只是忘记为 SQL 数据库中的某个列添加索引 - 谁知道呢。

另一方面,如果你的瓶颈是 2。那么你肯定有一个巨大的设计问题。通常序列化不是问题,除非你做错了什么,比如试图序列化大量没有人需要或人类可以消费的数据。在这种情况下,您当然应该与发明您正在实现的屏幕的 UI 人员交谈,并向他们解释在分辨率为 1024x768 的屏幕上显示 100 万个点几乎没有意义(只是一个示例)然后当然要改进您的查询,以便您的视图模型不会那么大。

因此,底线是您应该缩小丢失时间的范围(使用分析器是一个很好的开始,我建议您使用 Telerik 的 JustTrace),以便您确切知道需要改进的地方。

【讨论】:

感谢@Darin 的建设性意见。如您所见,我在这里处理 Json 对象并没有真正的经验。所以这个特殊情况,当响应是 ~600kb 时,这是否被认为是大量数据? UI方面,我一次不会超过10万分,还是太大了吗? 这在很大程度上取决于您要实现的目标以及您如何显示数据。我再次强烈建议您深入研究这些数据,以便了解时间是否浪费在查询数据或将其序列化为 JSON 上。获得这些数字后,您将能够查明问题的确切位置并提出更具建设性的问题。 我用的是JustTrace,大部分消耗时间来自两个方法:System.Threading.WaitHandle.WaitOne(...) 和 System.Threading.Thread.Sleep()。您认为这其中的原因是什么?非常感谢您迄今为止的帮助

以上是关于传递需要的大量 Json 对象时如何改进 Asp.net Mvc 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件和 json 对象从邮递员传递到 asp.net 核心 webapi

当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误

通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)

在 PRISM 4 中导航到新视图时如何改进传递对象

如何将json字符串传递给webmethod c# ASP.NET

如何使用 json 将复杂类型传递给 ASP.NET MVC 控制器