Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распаковать ответ, сжатый GZip`ом (VB.NET) / 15 сообщений из 15, страница 1 из 1
05.11.2013, 23:04
    #38453795
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
здравствуйте.
Есть объект 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
06.11.2013, 09:20
    #38453967
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
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
06.11.2013, 09:22
    #38453969
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
Разумный вопрос: а что делать? Разумный ответ: использовать HttpWebResponse .
...
Рейтинг: 0 / 0
06.11.2013, 09:32
    #38453977
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
МСУ, спасибо за ответ. Я в курсе, что WinHTTP не поддерживает автораспаковки сжатой страницы, в отличие от HttpWeb или как он там называется. WinHTTP просто возвращает в ResponseText сжатую GZip`ом строку. Вот её мне и надо как-то разжать... и уже результат закинуть в Doc.
...
Рейтинг: 0 / 0
06.11.2013, 09:44
    #38453992
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
Диам, я думаю, без вариантов.
...
Рейтинг: 0 / 0
06.11.2013, 09:59
    #38454003
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
МСУДиам, я думаю, без вариантов.вы считаете, что невозможно распаковать строку, полученную от WinHttp? Почему?
Это как-то несерьезно. Я знаю, что это возможно, но у меня это пока не получается за недостатком опыта.
На дельфи я тоже самое делаю без проблем - получаю ответ сжатый GZip`ом, распаковываю и получаю рабочую страницу.
...
Рейтинг: 0 / 0
06.11.2013, 10:02
    #38454007
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
Диамвы считаете, что невозможно распаковать строку, полученную от WinHttp? Почему?
Ну я же дал ответ выше: not support for gzip and deflate compression scheme

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


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

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

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

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

Может проще вот так задать вопрос: есть строка запакованная в GZip. Как её правильно распаковать и получить строку распакованную?
...
Рейтинг: 0 / 0
06.11.2013, 10:46
    #38454073
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
...
Рейтинг: 0 / 0
06.11.2013, 11:25
    #38454153
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
МСУ, спасибо.
А как это сделать родными средствами System.IO.Compressed ?
...
Рейтинг: 0 / 0
06.11.2013, 11:30
    #38454165
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
ДиамА как это сделать родными средствами 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
06.11.2013, 11:31
    #38454168
KVVK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
Диам, правда на 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
06.11.2013, 12:00
    #38454228
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как распаковать ответ, сжатый GZip`ом (VB.NET)
Ок. Спасибо. Буду разбираться
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как распаковать ответ, сжатый GZip`ом (VB.NET) / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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