Я пытаюсь вернуть пользовательский объект из кода VB.NET позади в HTTP-сообщение AngularJS. На основе пользовательских запросов этот объект может быть очень большим. Очень, очень большой. Всякий раз, когда это случалось, я получал исключение OutOfMemoryException при попытке его сериализации. Поэтому я теперь использую пакет JSON.NET от Newtonsoft для его серийного использования с помощью 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, а затем очистить ответ, чтобы вернуть его на вызов веб-клиента. Однако я не могу понять, как это сделать.
Любая помощь? Или, если я ухожу с пути, дайте мне лучший способ сделать это?
Обновление 1
По-видимому, я не могу использовать HttpResponse в операторе Using, потому что я получаю ошибку "using operand должен реализовывать system.idisposable". Так что теперь мне не удается создать объект HttpResponse в WebMethod. Передача как 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()
Затем, когда я приостанавливаю свой JavaScript в консоли разработчика Chrome, объект ответа является пустой строкой. 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.
Вы можете получить объект ответа из HttpContext:
[WebMethod]
public static void YourServiceMethod()
{
HttpResponse response = HttpContext.Current.Response;
// ... now go on
}
Объект response имеет свойство OutputStream
которое вы можете передать конструктору StreamWriter
(в инструкции using), как в этом ответе на другой вопрос:
using (TextWriter textWriter = new StreamWriter(response.OutputStream, System.Text.Encoding.UTF8))
{
// ... now write your data
}
(Извините, я даю образцы С#, это то, что я гораздо лучше знаком.)