2012-02-14 4 views
3

私は、フォームポスト経由でASP.NET MVC Webサイトに注文を送信するiPadアプリを持っています。 JSONを投稿しています.JSONは、特定の条件下でモバイルデバイスが送信する(200〜300K)ためにかなり大きいことがあります。私はフォームのポストをGZipすることができますが、その後、gzipの内容についてはasp.net mvcのチョークを行います。どのように処理し、asp.net MVCでGZip形式のポストを収縮するのですか?

asp.net mvcでGZippedフォームのポストを処理するにはどうすればよいですか?

UPDATE:

ダーリンの答えは右のトラックに私を置きますが、私はまだ彼が示唆するものを行う方法が分からないので、私が午前のはここです:

文字列を解凍するには、このコードを持っています:

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. 

EDIT - 完成したコード

私は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

どのように投稿データを圧縮しますか?あなたはそれをjavascriptでライブ圧縮しますか? – Aristos

+0

iOSアプリケーションで投稿データを圧縮しています。これはASIHttpRequestを使用しているライブラリのオプションです。http://allseeing-i.com/ASIHTTPRequest/ – Slee

答えて

1

カスタムモデルバインダーなしでこれを行うことができます。 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"); 
    } 

ファイルのアップロード要求を送信するためにクライアント側のコードを変更する必要がありますが、それはかなり簡単です。たとえば、これはcodeです。

+0

私のクライアント側のコードは、私がこの答えを読むまで私がクリックしていなかったことを既にしていました。誰かが必要とする場合に備えて、完成したコードを含めるように質問を更新しました。 – Slee

1

How can I handle a GZipped form post in asp.net mvc?

あなたは、直接Request.InputStreamを読み込みますカスタムモデルバインダーを書き、それを解凍してから内容を解析でき、バインドするビューモデルをインスタンス化します。

+1

Request.InputStreamを適切に圧縮する方法はありますか?私の頭をこの壁にぶつけていた。 – Slee

関連する問題