Чтение тела при частичной передаче закодированных HTTP-запросов в ASP.NET - PullRequest
4 голосов
/ 16 сентября 2008

Клиент J2ME отправляет HTTP-запросы POST с частичной кодировкой передачи.

Когда ASP.NET (как в IIS6, так и в WebDev.exe.server) пытается прочитать запрос, он устанавливает Content-Length на 0. Я думаю, это нормально, потому что Content-length неизвестен при загрузке запроса.

Однако, когда я читаю Request.InputStream до конца, он возвращает 0.

Вот код, который я использую для чтения входного потока.

using (var reader = new StreamReader(httpRequestBodyStream, BodyTextEncoding)) {
    string readString = reader.ReadToEnd();
    Console.WriteLine("CharSize:" + readString.Length);
    return BodyTextEncoding.GetBytes(readString);
}

Я могу смоделировать поведение клиента с помощью Fiddler, например

URL http://localhost:15148/page.aspx

Заголовки: Пользователь-агент: Fiddler Передача-Кодировка: Chunked Ведущий: somesite.com:15148

Body кролики кролики кролики кролики. спасибо, что пришли, это было очень полезно!

Мой читатель тела сверху вернет байтовый массив нулевой длины ... lame ...

Кто-нибудь знает, как включить кодирование по частям на IIS и ASP.NET Development Server (cassini)?

Я нашел этот скрипт для IIS, но он не работает.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Официально: Cassini не поддерживает Transfer-Encoding: chunked запросов.

По умолчанию клиент отправляет большие двоичные потоки с использованием фрагментированного HTTP Transfer-Encoding. Потому что ASP.NET Сервер разработки не поддерживает этот вид кодировки , вы не можете использовать этот веб-сервер для размещения потоковой передачи служба данных, которая должна принимать большие двоичные потоки.

1 голос
/ 17 сентября 2008

Этот URL больше не работает, поэтому сложно проверить это напрямую. Я подумал, будет ли это работать, и Google нашел кого-то, кто имеет опыт работы с ним, по адресу bytes.com . Если вы снова включите свой веб-сайт, я смогу увидеть, действительно ли это работает.

Joerg Jooss писал: ( слегка изменено для краткости )

string responseText = null;
WebRequest rabbits= WebRequest.Create(uri);
using (Stream resp = rabbits.GetResponse().GetResponseStream()) {
    MemoryStream memoryStream = new MemoryStream(0x10000);
    byte[] buffer = new byte[0x1000];
    int bytes;
    while ((bytes = resp.Read(buffer, 0, buffer.Length)) > 0) {
        memoryStream.Write(buffer, 0, bytes);
    }
    // use the encoding to match the data source.
    Encoding enc = Encoding.UTF8;
    reponseText = enc.GetString(memoryStream.ToArray());
}
...