如何在asp.net MVC中处理和解压缩gzip表单帖子?

如何在asp.net MVC中处理和解压缩gzip表单帖子?,asp.net,asp.net-mvc,gzip,Asp.net,Asp.net Mvc,Gzip,我有一个iPad应用程序,可以通过form post向ASP.NET MVC网站提交订单。它发布了JSON,在某些条件下,移动设备可以发送相当大的JSON(200~300K)。我可以GZip表单帖子,但是我的asp.NETMVC被GZip内容阻塞了 如何在asp.net mvc中处理Gzip表单帖子 更新: Darin的回答让我走上了正确的道路,但我仍然不知道如何按照他的建议去做,所以我现在的处境是: 使用以下代码解压缩字符串: 我得到的字符串是这样的: StreamReader reader

我有一个iPad应用程序,可以通过form post向ASP.NET MVC网站提交订单。它发布了JSON,在某些条件下,移动设备可以发送相当大的JSON(200~300K)。我可以GZip表单帖子,但是我的asp.NETMVC被GZip内容阻塞了

如何在asp.net mvc中处理Gzip表单帖子

更新:

Darin的回答让我走上了正确的道路,但我仍然不知道如何按照他的建议去做,所以我现在的处境是:

使用以下代码解压缩字符串:

我得到的字符串是这样的:

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.NETMVC,这对我来说非常有用。我还必须处理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();
            }
        }
如何在asp.net mvc中处理Gzip表单帖子


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

使用System.IO.Compression.GZipStream类


无需自定义模型活页夹即可完成此操作。编写一个接受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");
    }

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

知道如何正确地对Request.InputStream进行放气吗?在这件事上我的头撞到了墙上。你如何压缩你的帖子数据?你用javascript实时压缩它吗?我在iOS应用程序中压缩我的帖子数据,这是我使用ASIHttpRequest的库上的一个选项:我的客户端代码已经在这样做了,直到我读到这个答案它才与我一起点击-谢谢!我更新了我的问题,以包括完整的代码,以防有人需要它。