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
maxRequestLength
を設定してみてください。
<httpRuntime targetFramework="4.5" maxRequestLength="65536" />
または maxAllowedContentLength
(どちらがどれか、いつも混乱します)。
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
</requestFiltering>
</security>
また、この方法でデータを投稿することを再検討します。 MSDNのこの記事 を読んでください。これは主にWCF向けですが、コンテンツはほとんど有効だと思います。
大きなペイロードを処理する戦略はストリーミングです。
最後の例の補足事項。 await
を使用できる場合は、.Result
を使用しないでください(またはほとんど使用しないでください)。 Stephen Cleary はその上に良い答えを書いた here 。