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

标签 asp.net asp.net-mvc gzip

我有一个 iPad 应用程序,它通过表单发布向 ASP.NET MVC 网站提交订单。它发布的 JSON 对于移动设备在特定条件下发送来说可能相当大 (200~300K)。我可以对表单帖子进行 GZip 压缩,但随后我的 asp.net mvc 会因压缩后的内容而阻塞。

如何在 asp.net mvc 中处理 GZip 格式的帖子?

更新:

Darin 的回答让我走上了正确的轨道,但我仍然不知道如何按照他的建议去做,所以这就是我所在的位置:

用这段代码来解压一个字符串:

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,这对我来说效果很好。我还必须处理在进行 gzip 压缩时发生的一些其他编码:

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

最佳答案

您可以在没有自定义模型 Binder 的情况下执行此操作。编写一个接受 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 .

关于asp.net - 我如何处理和缩小 asp.net MVC 中的 GZipped 表单帖子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282312/

相关文章:

c# - .NET 快速启动项目和本地数据库/MDF 在本地主机上工作但在远程服务器上出现异常?

c# - 在 C# 中从数据库生成 PDF 报告,特别是 ASP

c# - 我可以从 null 中分辨出未定义的 Action 参数吗?

Python WhiteNoise 在 Flask 应用程序中不是 gzip 压缩

c# - 表单中不存在的所需实体验证失败?

c# - 如何通过 HttpPostedFileBase 与 ViewModel 一起发送上传的文件?

javascript - 在 MVC Razor 的 Javascript 中,用模型中的值替换关键字

php - 如何通过终端获取 PHP 的 tar.gz 文件?

c++ - zlib inflate 返回缓冲区错误

c# - C# 获取用户计算机的IP地址