【问题标题】:.NET MVC StackOverflow exception after returning View返回 View 后的 .NET MVC StackOverflow 异常
【发布时间】:2015-07-22 23:21:48
【问题描述】:

在将视图发送到客户端后,我的 .NET MVC 项目中出现“System.StackOverflowException”。视图正确呈现,因此客户端看不到错误。但是,服务器随后因 StackOverflow 异常而崩溃。我只在 IISExpress/VisualStudio 中测试过这个,而不是在 IIS 中。

我在远程服务器上有 html 文件。我正在加载这样的html文件:

using (WebClient client = new WebClient() 
{Credentials = new NetworkCredential(Username, Password)})
{
    string html = client.DownloadString(url);
    viewModel.Pages.Add(html);
}

“页面”可以包含多个 html 片段。但是,我使用的测试页面是一个完整的 html 页面,带有“doctype”、“head”、“body”等节点。

在我的视图中,我正在呈现这样的页面:

foreach(var page in Model.Pages)
{
    @Html.Raw(page)
}

正如我所说,页面正确呈现,但服务器随后崩溃。我没有看到任何递归调用。我尝试使用调试诊断工具进行故障排除,但无法填充任何故障转储。

此外,如果我在没有 @Html.Raw() 的情况下呈现“页面”,则不会发生崩溃(但是,页面无法正确呈现。例如,LT/GT 括号被替换为“& gt ;" / "& lt;" 等字符)

我怀疑这可能与“html”字符串的长度或页面内容有关。我有另一个更简单、加载正确且不会导致服务器错误的站点地图页面。

异常也发生在不同的地方:System.Web.dll、mscorlib.dll 和 System.Runtime.Serialization.dll

如何解决此 StackOverflow 异常?

可以使用@Html.Raw() 呈现的字符串的大小是否有限制?

外部堆栈跟踪:

System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlJsonWriter.HasOpenAttribute.get() 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlJsonWriter.WriteState.get() 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlJsonWriter.WriteStartAttribute(string prefix, string localName, string ns) 未知 System.Xml.dll!System.Xml.XmlWriter.WriteAttributeString(string localName, string value) 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.JsonWriterDelegator.WriteInt(int value) 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.IntDataContract.WriteXmlValue(System.Runtime.Serialization.XmlWriterDelegator writer, object obj, System.Runtime.Serialization.XmlObjectSerializerWriteContext context) 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.JsonDataContract.WriteJsonValueCore(System.Runtime.Serialization.XmlWriterDelegator jsonWriter, object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.RuntimeTypeHandle declaredTypeHandle) Unknown System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.WriteDataContractValue(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle) Unknown System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool verifyKnownType, System.RuntimeTypeHandle declaredTypeHandle, System.Type声明类型)未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.SerializeWithXsiType(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle objectTypeHandle, System.Type objectType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle, System.Type 声明类型)未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContextComplex.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) 未知 【轻量级功能】
System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.JsonCollectionDataContract.WriteJsonValueCore(System.Runtime.Serialization.XmlWriterDelegator jsonWriter, object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.RuntimeTypeHandle declaredTypeHandle) Unknown System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.WriteDataContractValue(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle) Unknown System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool verifyKnownType, System.RuntimeTypeHandle declaredTypeHandle, System.Type声明类型)未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.SerializeWithXsiType(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle objectTypeHandle, System.Type objectType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle, System.Type 声明类型)未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) 未知 System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContextComplex.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) 未知

从[轻量级函数]到结尾的部分一直重复,直到崩溃。

编辑:

刚刚在“输出”窗口中发现此错误(以及其他错误):mscorlib.dll 中出现“System.UnauthorizedAccessException”类型的第一次机会异常

【问题讨论】:

  • 完整的堆栈跟踪是什么样的?
  • 我确实在外部堆栈跟踪上看到了递归:[轻量级函数]; WriteJsonValueCore(); WriteDataContractValue(); SerializeWithoutXsiType(); WriteContext.InternalSerialize(); WriteContextComplex.InternalSerialize(); REPEAT(不确定如何最好地在评论中显示堆栈跟踪)
  • 你能告诉我们筹码交易吗,只是edit它进入问题。
  • 我知道这是一个较旧的线程,但我遇到了同样的问题,这是由我添加到页面的无效 html 引起的。因此,也许您的页面也是 html 无效的 - 只是为了让其他人知道。
  • 我遇到了同样的问题。尝试通过 Html.Raw() 显示大型日志文件的内容。堆栈跟踪以 System.Web.HttpResponseUnmanagedBufferElement.HttpResponseUnmanagedBufferElement() 结尾

标签: .net asp.net-mvc stack-overflow


【解决方案1】:

通过返回 'Content' 而不是 'View(model)' 解决了这个问题。

之前,我将 html 字符串添加到 ViewModel 并通过返回来呈现页面:

return View(model);

当我将返回更改为 Content 时,服务器并没有崩溃。

return Content(htmlString);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2018-10-23
    相关资源
    最近更新 更多