我有一个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();
}
}
答案 0 :(得分:1)
如何处理asp.net mvc中的GZipped表单帖子?
您可以编写一个自定义模型绑定器,它将直接读取Request.InputStream,解压缩然后解析内容并实例化您想要绑定的视图模型。
答案 1 :(得分:1)
使用System.IO.Compression.GZipStream类。
答案 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。