我有一个 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/