我有一个.NET Core API项目,该项目具有一个简单的端点来上传文件:
daemon thread
我尝试使用Postman进行测试,但是每次将文件发布到端点时,都会收到400 Bad Request错误。我的端点永远不会受到攻击。
我还有几个其他的POST端点都可以正常工作,所以这个特定端点或Postman都是一个问题。这是我在邮递员中的设置:
我一直在努力弄清楚问题出在哪里,但这根本没有多大意义,我在跟踪我在网上看到的示例。
我在做什么错了?
答案 0 :(得分:4)
我看到您已经设置了[ApiController]
属性,所以我假设您正在运行ASP.Net Core 2.1。
如果尚未设置,请尝试在Startup.cs中将services.AddMvc()
修改为services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
。
前段时间我遇到了类似的问题,以上更改对我来说已经解决了。我找到了问题here的答案。
希望这会有所帮助!
答案 1 :(得分:1)
尝试一下。
[HttpPost]
public async Task<IActionResult> UploadFile([FromForm]IFormFile file)
{
var model = await _filesService.UploadFile(file);
return Ok();
}
并删除ApiController属性
答案 2 :(得分:1)
我在尝试通过 AJAX 而不是 Form.Submit 发布 FormFile 时遇到了同样的问题,但无法在网上的任何地方找到完整的解决方案。我会在这里发布我的解决方案,以防其他人偶然发现。
我的问题是控制器上的 [AutoValidateAntiForgeryToken] 属性,就像 Cole W 在他的评论中提到的那样。这似乎与 Steven 最初面临的问题不同,但显然 @Html.AntiForgeryToken()
将使用令牌创建一个隐藏的表单字段 __RequestVerificationToken,以便在提交时发布。但是,当您尝试手动发布表单时,这并没有完成,您必须自己添加此字段。对我来说,客户端代码最终看起来像这样:
const formData = new FormData();
formData.append('file', file);
formData.append(
'__RequestVerificationToken',
$('input[name=__RequestVerificationToken]').val());
$.ajax({
cache: false,
type: 'POST',
url: 'somePostUrl',
data: formData,
contentType: false,
processData: false
});
Postman 相当于一个额外的键/值对,尽管需要找到一种方法来获取实际的令牌。出于测试目的,如果由于 [AutoValidateAntiForgeryToken] 属性位于基类中而无法简单地删除它,则可以将 [IgnoreAntiforgeryToken] 添加到当前控制器或端点方法中。
希望这在未来可以免除某些人的头疼!我在这上面浪费了很多时间...
答案 3 :(得分:-1)
在Postman客户端中的URL下方尝试
http://localhost:5001/api/Files/UploadFile