如何在asp.net MVC中处理和解压缩gzip表单帖子?
我有一个iPad应用程序,可以通过form post向ASP.NET MVC网站提交订单。它发布了JSON,在某些条件下,移动设备可以发送相当大的JSON(200~300K)。我可以GZip表单帖子,但是我的asp.NETMVC被GZip内容阻塞了 如何在asp.net mvc中处理Gzip表单帖子 更新: Darin的回答让我走上了正确的道路,但我仍然不知道如何按照他的建议去做,所以我现在的处境是: 使用以下代码解压缩字符串: 我得到的字符串是这样的:如何在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
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的库上的一个选项:我的客户端代码已经在这样做了,直到我读到这个答案它才与我一起点击-谢谢!我更新了我的问题,以包括完整的代码,以防有人需要它。