【发布时间】:2017-06-25 14:44:57
【问题描述】:
我有一个大的 JSON 对象,我需要将它传递给 Web 浏览器中显示的视图。因为我不能有一个带有 Action 的控制器来返回这个 JSON 对象,所以我想在 Razor 视图中添加 JSON 对象。
@Html.Hidden("fileContent", fileContent);<textarea style="display:none"> @fileContent </textarea>
以上都不是我期望和给我的方式,
引发了“System.OutOfMemoryException”类型的异常。
说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。
是的,我同意最好以另一种方式重组流程(may be as Mediator suggest 或采取行动返回 JSON 对象。)
- 这是 MVC 的限制,我们可以为 MVC 视图设置的最大大小?
- 这是因为 IIS Express 配置吗?
- 还有其他方法可以解决这个问题吗?或者将大对象传递给客户端浏览器的最佳方式。
感谢您的宝贵时间。任何帮助将不胜感激。
编辑
控制器
var file = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/content/data.csv"));
ViewData.Add("file", file);
return View();
堆栈跟踪
[OutOfMemoryException:'System.OutOfMemoryException' 类型的异常 被抛出。] System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount) +163 System.Text.StringBuilder.Append(Char* 值,Int32 值计数)+82
System.Text.StringBuilder.AppendHelper(字符串值)+31
System.Text.StringBuilder.Append(字符串值)+186
System.IO.StringWriter.Write(字符串值) +30
System.Web.WebPages.WebPageBase.Write(对象值) +87
【问题讨论】:
-
什么是
fileContent?将它发送到视图然后再原封不动地再次发送回去有什么意义? -
有很多因素导致
OutOfMemoryException,例如StringBuilder某个线程的溢出或内存分配不足。检查控制器代码以确保正确处理资源分配。 -
@StephenMuecke fileContent 是一个 JSON 字符串。我将该字符串转换为客户端 java 脚本中的 JSON 对象。此 JSON 对象将用于呈现页面。
-
data.csv有多大? -
问题似乎是 Razor 无法分配足够的连续内存来创建 1.5 MB 数组(由于 UTF-16 可能是 3 MB,由于 StringBuilder 的内部扩展可能是 4 MB大批)。抛出这个异常的内存太少了。尝试使用字符串数组代替,看看是否能解决问题。
标签: c# json asp.net-mvc razor