Как мне обработать и удалить GZIP-форму в asp.net MVC? - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть приложение для iPad, которое отправляет заказы на веб-сайт ASP.NET MVC через форму сообщения. Он публикует JSON, который может быть достаточно большим для отправки с мобильного устройства (200 ~ 300 КБ) при определенных условиях. Я могу GZip пост формы, но затем мой asp.net mvc задыхается от gzipped контента.

Как мне обработать сообщение формы GZipped в asp.net mvc?

UPDATE:

Ответ Дарина ставит меня на правильный путь, но я до сих пор не знаю, как сделать то, что он предлагает, поэтому вот где я нахожусь:

Используйте этот код для распаковки строки:

http://dotnet -snippets.com / DNS / сжимают-и-разжимать-строки-SID612.aspx

И я получаю строку примерно так:

StreamReader reader = new StreamReader(Request.InputStream);
string encodedString = reader.ReadToEnd();

но это дает мне ошибку:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters.

РЕДАКТИРОВАТЬ - ЗАВЕРШЕННЫЙ КОД

Я использую asp.net MVC, и это прекрасно работает для меня. Мне также пришлось иметь дело с какой-то другой кодировкой, которая происходит, когда происходит мой gzipping:

[Authorize]
[HttpPost]
[ValidateInput(false)]
public ActionResult SubmitOrder()
        {

            GZipStream zipStream = new GZipStream(Request.InputStream, CompressionMode.Decompress);
            byte[] streamBytes = ReadAllBytes(zipStream);
            var result = Convert.ToBase64String(streamBytes);
            string sample = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(result));
            string escaped = Uri.UnescapeDataString(sample);

 // escaped now has my form values as a string like so: var1=value1&var2=value2&ect...

//more boring code

}



 public static byte[] ReadAllBytes(Stream input)
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Используйте класс System.IO.Compression.GZipStream.

Пример проекта кода

1 голос
/ 18 февраля 2012

Вы можете сделать это без пользовательского связывателя модели.Напишите действие, которое принимает HttpPostedFileBase, т. Е. Рассматривайте это как загрузку файла.

    [HttpPost]
    public ActionResult UploadCompressedJSON(HttpPostedFileBase file)
    {
        if (file != null && file.ContentLength > 0)
        {
            GZipStream zipStream = new GZipStream(file.InputStream, CompressionMode.Decompress);
            byte[] streamBytes = ReadAllBytes(zipStream);
            var result = Convert.ToBase64String(streamBytes);
        }
        return RedirectToAction("Index");
    }

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

1 голос
/ 14 февраля 2012

Как я могу обработать сообщение формы GZipped в asp.net mvc?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...