发布IFormFile时出现错误请求(400)

时间:2018-12-01 05:18:23

标签: c# asp.net-web-api asp.net-core postman

我有一个.NET Core API项目,该项目具有一个简单的端点来上传文件:

daemon thread

我尝试使用Postman进行测试,但是每次将文件发布到端点时,都会收到400 Bad Request错误。我的端点永远不会受到攻击。

我还有几个其他的POST端点都可以正常工作,所以这个特定端点或Postman都是一个问题。这是我在邮递员中的设置:

enter image description here

我一直在努力弄清楚问题出在哪里,但这根本没有多大意义,我在跟踪我在网上看到的示例。

我在做什么错了?

4 个答案:

答案 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