c# – Json.Net仅在Visual Studio中抛出OutOfMemoryException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Json.Net仅在Visual Studio中抛出OutOfMemoryException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2570字,纯文字阅读大概需要4分钟。
内容图文
![c# – Json.Net仅在Visual Studio中抛出OutOfMemoryException](/upload/InfoBanner/zyjiaocheng/810/9d43836dd2634c87ab5b75cf7108e391.jpg)
我有一些奇怪的行为,我无法弄清楚.
我正在使用WCF服务将文件保存到某个数据库表. WCF服务有一个方法,它将JSON字符串作为参数.在这种情况下,JSON是一个序列化命令,其中包含List< FileData>除其他财产外. WCF服务反序列化JSON并为此特定命令运行CommandHandler.
最终用户在尝试上传大小为52 MB的文件时遇到了错误. WCF服务返回404错误.
我能够在Visual Studio中重现这一点.根据此article更改配置文件后,404消失了.
但是现在出现了一个新的异常:当命令成功序列化客户端,由WCF成功处理时,反序列化会抛出OutOfMemoryException.这是堆栈跟踪的顶部:
at Newtonsoft.Json.JsonTextReader.ReadData(Boolean append, Int32 charsRequired)
at Newtonsoft.Json.JsonTextReader.ReadData(Boolean append)
at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char quote)
at Newtonsoft.Json.JsonTextReader.ParseString(Char quote)
at Newtonsoft.Json.JsonTextReader.ParseValue()
at Newtonsoft.Json.JsonTextReader.ReadInternal()
at Newtonsoft.Json.JsonReader.ReadAsBytesInternal()
at Newtonsoft.Json.JsonTextReader.ReadAsBytes()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)
我写了一个单元测试来证明这个bug.但是,这个测试通过了所有的可能性,换句话说,没有抛出OutOfMemoryException.
为完整性而进行的测试:
[TestMethod]
public void LoadBigFile_SerializeDeserialize_DoesntThrowOutOfMemoryException()
{
// Arrange
byte[] bytes = new byte[80000000];
Random r = new Random(23);
r.NextBytes(bytes);
var command = new SomeCommand(new List<FileData>
{
new FileData(
fileFullName: @"D:\SomePdfFile.pdf",
modifyDate: DateTime.MaxValue,
data: bytes
)
});
var data = JsonConvert.SerializeObject(command);
// Act
var deserializedCommand =
JsonConvert.DeserializeObject<SomeCommand>(data);
// Assert
Assert.AreEqual(bytes.Length, deserializedCommand.Files.First().Data.Length);
}
所以,我抓住了机会,改变了生产中的配置文件,并尝试上传相同的文件.这才有效!!!没有OutOfMemoryException!
现在我的问题是,为什么OutOfMemoryException只发生在Visual Studio中,而VS的同一个实例中的unittest却没有?感觉有点奇怪,我无法测试在Visual Studio中上传大文件,而它在生产中工作.请注意,我也尝试在Release模式下运行Debug.
一些细节:
>使用Json.Net 7.0.1
> Visual Studio 2015,更新2
> WCF在本地IIS Express中托管,IIS在生产中
> Windows 10最新版64位
>生产服务器Windows server 2008 R2 64位
> .Net Framework 4.5.2
解决方法:
我通过改变byte [] bytes = new byte [80000000]在单元测试中重现了OutOfMemoryException; to byte [] bytes = new byte [52000000];并循环运行(2次).测试运行器是32位.
所以回到IIS Express – 我认为你使用的是32位版本.你可以改变它
Tools | Options | Projects and Solutions | Web Projects | Use the 64 bit version of IIS Express
内容总结
以上是互联网集市为您收集整理的c# – Json.Net仅在Visual Studio中抛出OutOfMemoryException全部内容,希望文章能够帮你解决c# – Json.Net仅在Visual Studio中抛出OutOfMemoryException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。