VB.NET InputStream пуст

Я использую .NET 4.0 и пытаюсь преобразовать Request.InputStream в строку. Я пробовал очевидное:

Dim req As HttpRequest = HttpContext.Current.Request
' Log input stream length
util.SystemError("inputstream length = " + req.InputStream.Length.ToString, "MBOL")
req.InputStream.Position = 0
Dim encodedString As String = New StreamReader(req.InputStream).ReadToEnd()

Это показывает мне, что длина входного потока составляет 1671, но кодированная строка, которую я получаю, пуста. Я добавил вокруг него try/catch, но, похоже, это не ошибка, он просто возвращает пустую строку.

Любые идеи, где это может пойти не так? Заранее благодарим за любую помощь в этом.


person singhster    schedule 21.06.2012    source источник


Ответы (1)


Входной поток не обязательно может быть прочитан несколько раз, это по контракту однократное чтение (хотя в некоторых реализациях это ограничение может быть ослаблено).

Как следствие, вы не можете взять его длину, так как это фактически читает поток. Даже сброс его позиции на 0 не гарантирует работу (и, как видите, не работает).

Если вы хотите получить длину содержимого перед его чтением, вам нужно полагаться на поле заголовка Content-Length. Обратите внимание, что сервер не обязан предоставлять это. Единственный 100% надежный способ получить длину контента — это прочитать контент, затем получить его длину.

Можно возразить, что базовый класс Stream вообще не должен иметь свойства Length. Это слабая конструкция.

person Konrad Rudolph    schedule 21.06.2012
comment
Спасибо, я удалил длину, но у меня все еще есть та же проблема. У меня был код длины, чтобы доказать, что там был поток. Мне интересно, есть ли в потоке где-то недопустимый символ, который препятствует успешному созданию строки? - person singhster; 21.06.2012
comment
Это действительно исправлено! У меня были первоначальные ошибки, и я добавил код длины, чтобы убедиться, что там что-то есть - его удаление действительно исправило код - большое спасибо. - person singhster; 21.06.2012