2016-07-25 2 views
1

私はweb apiプロジェクトを持っています。jsonのasp web.apiの最大HTTP要求サイズ

jsonデータをコード化されたbase64文字列(最大200 MB)としてファイルに書き込む必要があります。

もし私が約10MBまでのデータを送るならば、次のメソッドは通常、モデルImportMultipleFileModelを適切に埋めます。

[HttpPost] 
    public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel) 
    { 
     var response = ImportFiles(importFileModel); 
     return response; 
    } 

さらに送信すると、モデルはnullです。

なぜですか?

だから私はにメソッドシグネチャを変更します。

[HttpPost] 
     public async Task<HttpResponseMessage> ImportMultipleFiles() 
     { 
      ImportMultipleFileModel importMultipleFileModel = null; 
      var requestData = await Request.Content.ReadAsStringAsync(); 
      try 
      { 
       JsonConvert. 
       importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData); 
      }catch(Exception e) 
      { } 
} 

符号化された30メガバイトのファイルのために、私は通常、JSON文字列としてrequestDataを取得します。 60 MBのために私は空の文字列を得る。 なぜですか?

次私は

[HttpPost] 
     public async Task<HttpResponseMessage> ImportMultipleFiles() 
     { 
      ImportMultipleFileModel importMultipleFileModel = null; 
      var requestData = Request.Content.ReadAsStringAsync().Result; 
      try 
      { 
       importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData); 
      }catch(Exception e) 
      { } 
} 

とデシリアライズに方法を変更するには、理由のOutOfMemoryException失敗しました。

なぜですか?

UPD: maxRequestLength、maxAllowedContentLengthはmaxRequestLengthを設定してみてください2147483647

+0

これは60mbの文字列を、これを許さない構造にシリアル化しようとしています。要求ごとに60MBのメモリを保持する必要はありません。このため、ストリームを使用するか、リクエストを分割します。 –

答えて

5

に設定します。

<httpRuntime targetFramework="4.5" maxRequestLength="65536" /> 

それともmaxAllowedContentLength(私はいつも混乱どちらの)。

<security> 
    <requestFiltering> 
    <requestLimits maxAllowedContentLength="52428800" /> 
    </requestFiltering> 
</security> 

また、このようにデータを投稿することを再考します。 this article form MSDNを読んでください、それは主にWCFのためですが、私はその内容が主に有効だと思います。

大きなペイロードを処理する戦略はストリーミングです。

最後の例はサイドノートです。 awaitを使用できる場合は、.Resultを使用しないでください(まれにしか使用しないでください)。 Stephen Clearyはそれに良い答えを書いたhereです。

+0

これはすでに完了しています。 2147483647に設定します。申し訳ありませんが、私はdidn.tを指します。 –

関連する問題