我有一些奇怪的行为,我无法弄清楚。
我正在使用WCF服务将文件保存到某个数据库表中。WCF服务有一个采用JSON字符串作为参数的单一方法。在这种情况下,JSON是一个序列化命令,其中包含List<FileData>
其他属性。WCF服务反序列化JSON并CommandHandler
为该特定命令运行。
最终用户尝试上传大小为52 MB的文件时遇到错误。WCF服务返回404错误。
我能够在Visual Studio中重现此内容。根据本文更改配置文件后,404消失了。
但是现在出现了一个新的例外:当命令已成功序列化客户端(由WCF成功处理)时,反序列化将抛出OutOfMemoryException
。这是堆栈跟踪的顶部:
在Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(字符引用)在Newtonsoft.Json.Json.Reader.ReadStringIntoBuffer(字符引用) Newtonsoft.Json.Json.ReaderByte.Internal()的Newtonsoft.Json.Json.Json.ReaderByte.Internal()的Newtonsoft.Json.Json.Json.ReaderByte。 ReadForType(JsonReader阅读器,JsonContract合同,布尔值hasConverter)
我编写了一个单元测试来证明该错误。但是无论如何,这个测试都通过了,换句话说,没有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实例中却没有单元测试呢?我无法在Visual Studio中测试在生产环境中上传大文件时感到有点奇怪。请注意,我也尝试像在发布模式下一样在Debug中运行。
一些细节:
我OutOfMemoryException
通过更改byte[] bytes = new byte[80000000];
为byte[] bytes = new byte[52000000];
并循环运行(2次)来复制单元测试中的内容。测试运行程序是32位。
回到IIS Express-我认为您使用的是32位版本。您可以在以下位置更改
工具| 选项| 项目和解决方案| 网络项目| 使用IIS Express的64位版本
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句