我有web api项目.
我需要将json数据与文件一起发布为编码的base64字符串(最多200 mb).
如果我发送数据大约10 MB,那么下一个方法通常会正确填充模型ImportMultipleFileModel.
[HttpPost]
public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)
{
var response = ImportFiles(importFileModel);
return response;
}
Run Code Online (Sandbox Code Playgroud)
如果我发送更多,则模型为空.
为什么?
所以我将方法签名更改为:
[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)
{ }
}
Run Code Online (Sandbox Code Playgroud)
对于编码的30 MB文件,我通常将requestData作为json字符串.对于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)
{ }
}
Run Code Online (Sandbox Code Playgroud)
由于OutOfMemoryException,反序列化失败.
为什么?
UPD:maxRequestLength,maxAllowedContentLength设置为2147483647
我有一个方法,它采用 Stream 参数并将其传递给服务器
public async Task<string> Execute(Stream archive)
{
archive.Seek(0, SeekOrigin.Begin);
using var content = new MultipartFormDataContent();
content.Add(new StreamContent(archive), "file1", "file1");
var result = "";
using (var response = await _client.PostAsync(_uri, content))
{
if (response.IsSuccessStatusCode)
{
var stringResult = await response.Content.ReadAsStringAsync();
result = stringResult;
}
}
// here archive is already disposed
return result;
}
Run Code Online (Sandbox Code Playgroud)
现在我实现这个方法的重试策略。如果调用此方法的外部代码得到“”结果,则它会尝试再次调用此方法。但档案是在那一刻处理的。我看到存档流在处理响应后立即被处理。为什么?如果在这个方法之后需要外部流参数怎么办?