使用 post 操作提交大型表单数据 return .NET 6 中出现 400 错误
submit large form data with post action return 400 error in .NET 6
我正在使用 .NET 6 post 一个包含大量表单数据(大约 200Mb)的表单,并且没有任何文件。
这是我在前端的一种形式:
@using (Html.BeginForm(FormMethod.Post, new { id = "frm", @autocomplete = "off", @enctype="multipart/form-data" }))
{
@Html.AntiForgeryToken()
...
}
和后端:
[ValidateAntiForgeryToken]
[DisableRequestSizeLimit]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
引用自
我在前端提交了一个 VerificationToken
字段,并在后端用 ValidateAntiForgeryToken
过滤器装饰,所以它看起来不像是一个验证问题。
和来自 Matthew Steven Monkan and this answer,
我已经尝试了那里的所有设置,例如上面的 DisableRequestSizeLimit
过滤器,还尝试使用设置为 500Mb 的 RequestFormLimits
和 RequestSizeLimit
过滤器进行装饰。
[ValidateAntiForgeryToken]
[RequestFormLimits(MultipartBodyLengthLimit = 524288000)]
[RequestSizeLimit(524288000)]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
并且还尝试在 Program.cs
中设置:
builder.Services.Configure<HttpSysOptions>(options =>
{
options.MaxRequestBodySize = int.MaxValue;
});
builder.Services.AddMvc();
builder.Services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue;
x.MemoryBufferThreshold = int.MaxValue;
});
或在 KestrelServer 中:
builder.Services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = int.MaxValue;
});
但是还是不行...
这是我的请求正文信息和错误:
我可以 post 成功地使用请求内容长度约为 80Mb 的表单数据,但是上面的大小 (143,118) 无法工作,我是否还遗漏了其他内容?
有人可以帮忙吗?非常感谢!
我试过了,我可以post的最大表单数据大小约为130Mb(内容长度:133120)
已编辑:
这是我在 IIS 服务器上的 web.config。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\BASE.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
<security>
<requestFiltering>
<!-- This will handle requests up to 500MB -->
<requestLimits maxAllowedContentLength="524288000" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
<!--ProjectGuid: bfaa51b3-9cb0-4908-8d5e-6289bd4f329a-->
终于,Steven解决了我的问题。非常感谢!
改变 form data
大小的限制(而不是 file size
)是非常不同的。
您只能在 .NET 6 中使用 Program.cs
中的 RequestFormLimitsAttribute.ValueCountLimit to decorate the controller, or set FormOptions.ValueCountLimit 或 .NET 5 中的 Startup.cs
来创建完整站点。
上面两种方法我都试过了,都行!
这是示例代码
- 控制器:
[ValidateAntiForgeryToken]
[RequestFormLimits(ValueCountLimit = int.MaxValue)]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
- Program.cs (.NET 6):
builder.Services.Configure<FormOptions>(x =>
{
x.ValueCountLimit = int.MaxValue;
});
- startup.cs (.NET 5):
services.Configure<FormOptions>(options =>
{
options.ValueCountLimit = int.MaxValue
});
我正在使用 .NET 6 post 一个包含大量表单数据(大约 200Mb)的表单,并且没有任何文件。
这是我在前端的一种形式:
@using (Html.BeginForm(FormMethod.Post, new { id = "frm", @autocomplete = "off", @enctype="multipart/form-data" }))
{
@Html.AntiForgeryToken()
...
}
和后端:
[ValidateAntiForgeryToken]
[DisableRequestSizeLimit]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
引用自VerificationToken
字段,并在后端用 ValidateAntiForgeryToken
过滤器装饰,所以它看起来不像是一个验证问题。
和来自 Matthew Steven Monkan and this answer,
我已经尝试了那里的所有设置,例如上面的 DisableRequestSizeLimit
过滤器,还尝试使用设置为 500Mb 的 RequestFormLimits
和 RequestSizeLimit
过滤器进行装饰。
[ValidateAntiForgeryToken]
[RequestFormLimits(MultipartBodyLengthLimit = 524288000)]
[RequestSizeLimit(524288000)]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
并且还尝试在 Program.cs
中设置:
builder.Services.Configure<HttpSysOptions>(options =>
{
options.MaxRequestBodySize = int.MaxValue;
});
builder.Services.AddMvc();
builder.Services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue;
x.MemoryBufferThreshold = int.MaxValue;
});
或在 KestrelServer 中:
builder.Services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = int.MaxValue;
});
但是还是不行...
这是我的请求正文信息和错误:
我可以 post 成功地使用请求内容长度约为 80Mb 的表单数据,但是上面的大小 (143,118) 无法工作,我是否还遗漏了其他内容?
有人可以帮忙吗?非常感谢!
我试过了,我可以post的最大表单数据大小约为130Mb(内容长度:133120)
已编辑: 这是我在 IIS 服务器上的 web.config。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\BASE.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
<security>
<requestFiltering>
<!-- This will handle requests up to 500MB -->
<requestLimits maxAllowedContentLength="524288000" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
<!--ProjectGuid: bfaa51b3-9cb0-4908-8d5e-6289bd4f329a-->
终于,Steven解决了我的问题。非常感谢!
改变 form data
大小的限制(而不是 file size
)是非常不同的。
您只能在 .NET 6 中使用 Program.cs
中的 RequestFormLimitsAttribute.ValueCountLimit to decorate the controller, or set FormOptions.ValueCountLimit 或 .NET 5 中的 Startup.cs
来创建完整站点。
上面两种方法我都试过了,都行!
这是示例代码
- 控制器:
[ValidateAntiForgeryToken]
[RequestFormLimits(ValueCountLimit = int.MaxValue)]
[HttpPost]
public async Task<IActionResult> SearchList(VM_SearchList data)
- Program.cs (.NET 6):
builder.Services.Configure<FormOptions>(x =>
{
x.ValueCountLimit = int.MaxValue;
});
- startup.cs (.NET 5):
services.Configure<FormOptions>(options =>
{
options.ValueCountLimit = int.MaxValue
});