尝试接受具有大文件的模型时出现.netAPI错误
c#
c#-4.0
我有一个 API 方法,当一个大文件传递给它时,它会接收一个空模型参数。
我创建了一个测试客户端来测试这个端点。测试客户端和 API 都具有相同的模型,并且都使用 .NET 4.5:
public class FilingPostModel
{
public string Id { get; set; }
public string TypeId { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string Suffix { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Comment { get; set; }
public string DateSubmitted { get; set; }
public string Summary { get; set; }
public List<FilePostModel> FileData { get; set; }
}
public class FilePostModel
{
public string FileId { get; set; }
public string FileName { get; set; }
public string ContentType { get; set; }
public string FileContent { get; set; }
public string DateSubmitted { get; set; }
public string ClassificationId { get; set; }
}
测试客户端正在提交此模型:
City: "j"
Comment: null
Country: "United States"
Email: "test@test.tst"
FileData: Count = 1
TypeId: "f94e264a-c8b1-44aa-862f-e6f0f7565e19"
FirstName: "fname"
Id: null
LastName: "lname"
Line1: "testdrive 1"
Line2: null
MiddleName: null
PhoneNumber: "3748923798"
PostalCode: "12345"
State: "Pennsylvania"
Suffix: null
Summary: null
FileData 组件有一项:
FileContent: "xY+v6sC8RHQ19av2LpyFGu6si8isrn8YquwGRAalW/6Q..."
ClassificationId: null
ContentType: "text/plain"
FileName: "large.txt"
这是用于创建和发送 API 请求的测试客户端方法
public async Task<ActionResult> PostNewFiling(FilingPostModel model)
{
Dictionary<string, string> req = new Dictionary<string, string>
{
{"grant_type", "password"},
{"username", "some user name"},
{"password", "some password"},
};
FilingApiPostModel postModel = new FilingApiPostModel(model);
using (HttpClient client = new HttpClient())
{
client.Timeout = TimeSpan.FromMinutes(15);
client.BaseAddress = new Uri(baseUrl);
var resp = await client.PostAsync("Token", new FormUrlEncodedContent(req));
if (resp.IsSuccessStatusCode)
{
TokenModel token = JsonConvert.DeserializeObject<TokenModel>(await resp.Content.ReadAsStringAsync());
if (!String.IsNullOrEmpty(token.access_token))
{
foreach (HttpPostedFileBase file in model.Files)
{
if (file != null)
{
FilePostModel fmodel = new FilePostModel();
fmodel.FileName = file.FileName;
fmodel.ContentType = file.ContentType;
byte[] fileData = new byte[file.ContentLength];
await file.InputStream.ReadAsync(fileData, 0, file.ContentLength);
fmodel.FileContent = Convert.ToBase64String(fileData);
fmodel.ClassificationId = model.Classification1;
postModel.FileData.Add(fmodel);
}
}
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.access_token);
var response = await client.PostAsJsonAsync("api/Filing/PostFiling", postModel);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
return Json(new { responseBody });
else
return Json(new { error = true, message = "Error Uploading", obj = responseBody });
}
}
return Json(new { error = true, message = "Error Uploading" });
}
}
这是接收此客户端请求的 API 方法:
public async Task<StatusModel> PostFiling(FilingPostModel model)
这是 web.config 中的 maxAllowedContentLength 设置:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295" />
</requestFiltering>
</security>
</system.webServer>
API 模型始终null在此测试场景中。我收到两种类型的错误:
- Newtonsoft.Json - 数组尺寸超出支持范围
- Newtonsoft.Json - 解析值时遇到意外字符:x。路径 'FileData[0].Bytes',第 1 行,位置 517
此测试文件的文件大小为 560 MB。我使用Dummy File Creator来创建它。以下是内容示例:
ůêÀ¼Dt5õ«ö.œ…Ȭ®ªìD¥[þ6hW åz·cʾYP¸‡>•;,–@Ó¶ÿm™fø@ÃNÇIäÀ¿Y4~ëÆÃc¥EWÀ_÷õ9%«éÀG!WBÍ*G2P׿Ÿ7ú‚{ÓêRúÅîµMZSªšpt6ä”Òø˜H
我也尝试使用“fsutil file createnew”来创建一个测试文件,但收到类似的错误。
使用 256 MB 文件进行测试时,一切正常。
感谢您的帮助。