web-dev-qa-db-ja.com

JSONを使用したASP web.apiの最大HTTP要求サイズ

Web APIプロジェクトがあります。

エンコードされたbase64文字列(最大200 mb)としてファイルを含むJSONデータをそこに投稿する必要があります。

最大約10 MBのデータを送信すると、次のメソッドは通常、適切に入力されたモデル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 mbファイルの場合、通常、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:2147483647に設定されたmaxRequestLength、maxAllowedContentLength

11
vitm

maxRequestLength を設定してみてください。

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

または maxAllowedContentLength (どちらがどれか、いつも混乱します)。

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

また、この方法でデータを投稿することを再検討します。 MSDNのこの記事 を読んでください。これは主にWCF向けですが、コンテンツはほとんど有効だと思います。

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

最後の例の補足事項。 awaitを使用できる場合は、.Resultを使用しないでください(またはほとんど使用しないでください)。 Stephen Cleary はその上に良い答えを書いた here

16
smoksnes