【发布时间】:2016-10-07 18:22:13
【问题描述】:
我尝试将自定义对象从 VB.NET 代码返回到 AngularJS HTTP Post。根据用户请求,该对象可能非常大。非常非常大。每当发生这种情况时,我在尝试对其进行序列化时都会遇到 OutOfMemoryException。因此,我现在使用来自 Newtonsoft 的 JSON.NET 包来使用 StringWriter 对其进行序列化:
Using sw As New StringWriter()
Using writer As JsonWriter = New JsonTextWriter(sw)
Dim serializer As New JsonSerializer()
serializer.Serialize(writer, periodData)
writer.Flush()
End Using
End Using
虽然这可行,但当我尝试执行 sw.ToString 时,我仍然会收到 OutOfMemoryException。
所以,我浏览了互联网,我相信我可以使用 StreamWriter 发送到 HttpResponse 对象,然后刷新响应以将其返回给 Web 客户端调用。但是,我不知道该怎么做。
有什么帮助吗?或者,如果我偏离了轨道,请给我一个更好的方法来做到这一点?
更新 1
显然,我不能在 Using 语句中使用 HttpResponse,因为我收到“使用操作数必须实现 system.idisposable”错误。所以现在我无法在 WebMethod 中创建 HttpResponse 对象。将 TextWriter 和 HttpWriter 作为构造函数的参数传递给我错误。
更新 2
好的,所以我在尝试序列化对象时不再收到 OutOfMemoryException。但是,我相信我做错了什么,因为我的 StreamWriter 似乎没有写入 HttpResponse 对象。这是我当前的代码:
Dim response As HttpResponse = HttpContext.Current.Response()
response.ContentType = "application/json"
response.Clear()
response.BufferOutput = True
Using sw As New StreamWriter(response.OutputStream, System.Text.Encoding.UTF8)
Using writer As JsonWriter = New JsonTextWriter(sw)
Dim serializer As New JsonSerializer()
serializer.Serialize(writer, periodData)
writer.Flush()
End Using
sw.Flush()
End Using
response.Flush()
然后,当我在 Chrome 开发者控制台中暂停我的 JavaScript 时,响应对象只是一个空字符串。 javascript 只是一个基本的 Angular $http.post 调用:
$http.post('url.aspx/GetData', angular.toJson({
param1: data1,
param2: data2,
param3: data3
})).then(function (response) {
//Do stuff with response which is currently an empty string.
}
我不相信我的 VB.NET 代码是正确的。帮忙?
【问题讨论】:
-
内存不足并不是您的问题,因为您已经确定了解决方案 我可以使用 StreamWriter 发送到 HttpResponse 对象,然后刷新响应以将其返回到网络客户来电。你为什么不试试呢?如果您遇到问题,我们可以提供帮助,但我们无法为您编写代码 :)
标签: angularjs vb.net http-post out-of-memory code-behind