powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распаковать ответ, сжатый GZip`ом (VB.NET)
15 сообщений из 15, страница 1 из 1
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38453795
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте.
Есть объект w AS new WinHttpRequest, у которого в w.ResponseText сидит сжатый GZip`ом ответ сервера

Подскажите, как мне его правильно конвертнуть/распаковать, чтобы объект Doc:

Код: vbnet
1.
2.
Dim doc As Object ' New mshtml.HTMLDocument 'Object ' 
doc = CreateObject("htmlfile")



в результате представлял собой то, что нужно (html страничку)

Если использовать doc.write(w.ResponseText) - то получается ерунда, т.к. ответ сжатый.

Пробовал делать так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Dim dcmps As New IO.MemoryStream, cmps As New IO.MemoryStream
    Dim ByteArr() As Byte = System.Text.Encoding.Unicode.GetBytes(w.ResponseText)
    cmps.Write(ByteArr, 0, ByteArr.Length)

    Using Decompress As IO.Compression.GZipStream = New IO.Compression.GZipStream(cmps, _
                      IO.Compression.CompressionMode.Decompress)
      Decompress.CopyTo(dcmps)
    End Using

    Dim doc As Object ' New mshtml.HTMLDocument 'Object ' 
    doc = CreateObject("htmlfile")

    Using reader1 As New StreamReader(dcmps)
      doc.write(reader1.ReadToEnd())
    End Using



Но это не работает. В Doc после этого ерунда какая-то.
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38453967
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/en-us/library/windows/desktop/hh227298(v=vs.85).aspx Decompression Support
Support for gzip and deflate compression scheme (WinHTTP): no
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38453969
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумный вопрос: а что делать? Разумный ответ: использовать HttpWebResponse .
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38453977
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, спасибо за ответ. Я в курсе, что WinHTTP не поддерживает автораспаковки сжатой страницы, в отличие от HttpWeb или как он там называется. WinHTTP просто возвращает в ResponseText сжатую GZip`ом строку. Вот её мне и надо как-то разжать... и уже результат закинуть в Doc.
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38453992
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диам, я думаю, без вариантов.
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454003
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДиам, я думаю, без вариантов.вы считаете, что невозможно распаковать строку, полученную от WinHttp? Почему?
Это как-то несерьезно. Я знаю, что это возможно, но у меня это пока не получается за недостатком опыта.
На дельфи я тоже самое делаю без проблем - получаю ответ сжатый GZip`ом, распаковываю и получаю рабочую страницу.
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454007
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диамвы считаете, что невозможно распаковать строку, полученную от WinHttp? Почему?
Ну я же дал ответ выше: not support for gzip and deflate compression scheme

ДиамЭто как-то несерьезно. Я знаю, что это возможно, но у меня это пока не получается за недостатком опыта.
На дельфи я тоже самое делаю без проблем - получаю ответ сжатый GZip`ом, распаковываю и получаю рабочую страницу.
Что мешает использовать HttpWebResponse?
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454027
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу я же дал ответ выше: not support for gzip and deflate compression scheme
Ваша ссылка говорит о том, что WinHttp не поддерживает автоматической распаковки. То есть, получая запакованный ответ, распаковать его - это уже моя проблема. Вот с ней я и обращаюсь за помощью.


авторЧто мешает использовать HttpWebResponse?
Необходимость вручную переносить куки.
Еще словил проблему, что при отправке POST запроса, этот запрос отправляется в момент когда я Writer`ом записываю тело формы для отправки, а не в момент вызова GetResponse(). В результате, я не могу получить ответ в стрим. Может я там еще не до всего докопался, но пока легче работать с WinHttp
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454049
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамМСУНу я же дал ответ выше: not support for gzip and deflate compression scheme
Ваша ссылка говорит о том, что WinHttp не поддерживает автоматической распаковки. То есть, получая запакованный ответ, распаковать его - это уже моя проблема. Вот с ней я и обращаюсь за помощью.
Так ничего не говорится про "автоматическую" распаковку. Так говорится о "support for gzip and deflate compression scheme".

ДиамНеобходимость вручную переносить куки.
"Переносить" откуда? Отправка кукисов не обязательна, что за вздор?

ДиамЕще словил проблему, что при отправке POST запроса, этот запрос отправляется в момент когда я Writer`ом записываю тело формы для отправки, а не в момент вызова GetResponse().
Это вообще феерический бред. Кролик вырывается из рук и убегает в лес? Неверю (с)

ДиамМожет я там еще не до всего докопался, но пока легче работать с WinHttp
Так вот с этого и надо начинать вопрос. Я рекомендую тебе таки докопаться до HttpWebResponse. Его хватает за глаза и с горкой. Возникнут вопросы по работе с этим классом, спрашивай.
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454067
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
авторТак вот с этого и надо начинать вопрос. Я рекомендую тебе таки докопаться до HttpWebResponse. Его хватает за глаза и с горкой. Возникнут вопросы по работе с этим классом, спрашивай. Спасибо за ваше настойчивое советование что мне следует делать. Изучением HttpWebResponse я займусь и так, а сейчас у меня есть конкретный вопрос. Вы можете мне в нем помочь?

Может проще вот так задать вопрос: есть строка запакованная в GZip. Как её правильно распаковать и получить строку распакованную?
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454073
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454153
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, спасибо.
А как это сделать родными средствами System.IO.Compressed ?
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454165
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамА как это сделать родными средствами System.IO.Compressed ?
Так там сделано родными средствами System.IO.Compression. Смотри файл ZipHelper.cs.

ZipHelper.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
using System.IO;
using System.IO.Compression;

namespace Helpers
{
    public class ZipHelper
    {
        public static byte[] Compress(byte[] input)
        {
            using (var output = new MemoryStream())
            using (var zip = new GZipStream(output, CompressionMode.Compress))
            {
                zip.Write(input, 0, input.Length);
                zip.Close();
                return output.ToArray();
            }
        }

        public static byte[] Decompress(byte[] gzip)
        {
            const int size = 4096;
            byte[] buffer = new byte[size];

            using (var zip = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
            using (var memory = new MemoryStream())
            {
                int count = 0;
                do
                {
                    count = zip.Read(buffer, 0, size);
                    if (count > 0)
                    {
                        memory.Write(buffer, 0, count);
                    }
                }
                while (count > 0);
                zip.Close();
                return memory.ToArray();
            }
        }
    }
}

...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454168
KVVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Диам, правда на c#, но может поможет

byte[] r = System.Text.Encoding.Unicode.GetBytes(w.ResponseText);
string _FileText = null;

using (MemoryStream inStream = new MemoryStream(r))
using (GZipStream bigStream = new GZipStream(inStream, CompressionMode.Decompress))
using (MemoryStream bigStreamOut = new MemoryStream())
{
bigStream.CopyTo(bigStreamOut);
_FileText = System.Text.Encoding.Unicode.GetString(bigStreamOut.ToArray());
}
...
Рейтинг: 0 / 0
Как распаковать ответ, сжатый GZip`ом (VB.NET)
    #38454228
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Спасибо. Буду разбираться
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распаковать ответ, сжатый GZip`ом (VB.NET)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]