Проблема получения данных HttpResponse с AngularJS $ http.post

0

Я пытаюсь вернуть пользовательский объект из кода 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 верен. Помогите?

  • 0
    То, что вам не хватает памяти, не совсем ваша проблема, так как вы нашли решение, я могу использовать StreamWriter, отправленный объекту HttpResponse, а затем сбросить ответ, чтобы вернуть его вызову веб-клиента . Почему бы тебе не попробовать это? Если у вас возникнут проблемы, мы можем помочь, но мы не можем написать ваш код для вас :)
Теги:
http-post
out-of-memory
code-behind

1 ответ

0

Это не совсем понятно из вашего вопроса, где вы находитесь, но похоже, что вам не удается создать 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
}

(Извините, я даю образцы С#, это то, что я гораздо лучше знаком.)

  • 0
    Как получить данные StreamWriter в объект HttpResponse? Попытка очистки объекта JsonWriter, StreamWriter и HttpResponse. Никто не работал.
  • 0
    @MichaelWang StreamWriter записывает в выходной поток ответа, а вы пишете в StreamWriter - вот и все, в основном. --- Вы должны действительно следовать совету Вердолино и поместить суть вашего текущего кода в ваш вопрос. Это может быть просто маленькая деталь, которая не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню