如何在asp.net MVC中处理和缩小GZipped表单帖子?

时间:2012-02-14 18:38:11

标签: asp.net asp.net-mvc gzip

我有一个iPad应用程序,通过表单发布命令到ASP.NET MVC网站。它发布的JSON对于移动设备在某些条件下发送(200~300K)来说可能相当大。我可以GZip表单发布,然后我的asp.net mvc在gzip压缩内容上窒息。

如何处理asp.net mvc中的GZipped表单帖子?

更新:

达林的回答让我走上正轨,但我仍然不知道如何做他的建议,所以这就是我所处的位置:

让此代码解压缩字符串:

http://dotnet-snippets.com/dns/compress-and-decompress-strings-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 个答案:

答案 0 :(得分:1)

  

如何处理asp.net mvc中的GZipped表单帖子?

您可以编写一个自定义模型绑定器,它将直接读取Request.InputStream,解压缩然后解析内容并实例化您想要绑定的视图模型。

答案 1 :(得分:1)

使用System.IO.Compression.GZipStream类。

Codeproject example

答案 2 :(得分:1)

您可以在没有自定义模型绑定器的情况下执行此操作编写一个接受HttpPostedFileBase的Action,即将其视为文件上传。

    [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");
    }

您将需要更改客户端代码以发送文件上载请求,但这应该相当容易。例如,您可以查看此code