【问题标题】:Bad Request (400) when posting IFormFile发布 IFormFile 时出现错误请求 (400)
【发布时间】:2019-05-03 05:25:11
【问题描述】:

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

[Route("api/[controller]")]
[ApiController]
public class FilesController : Controller
{
    private IFilesService _filesService { get; set; }

    public FilesController(IFilesService filesService)
    {
        _filesService = filesService;
    }

    [HttpPost]
    public async Task<IActionResult> UploadFile(IFormFile file)
    {
        var model = await _filesService.UploadFile(file);
        return Ok();
    }
}

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

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

我一直在旋转我的轮子试图找出问题所在,但这根本没有什么,我正在按照我在网上看到的例子。

我做错了什么?

【问题讨论】:

  • 你试过使用asp.net web form / view吗?

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


【解决方案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] 添加到当前控制器或端点方法中。

希望这可以避免将来有人头疼!我在这上面浪费了相当多的时间......

【讨论】:

    【解决方案2】:

    我看到你已经设置了[ApiController] 属性,所以我假设你正在运行 ASP.Net Core 2.1。

    如果尚未设置,请尝试在 Startup.cs 中将 services.AddMvc() 修改为 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    不久前我遇到了类似的问题,上述更改为我解决了这个问题。我找到了问题的答案here

    希望这会有所帮助!

    【讨论】:

    • 哇,非常感谢,我永远不会发现
    • 是的 - 我浪费了一整天的时间来寻找它。很高兴我能帮助你。 :)
    • 我的问题与我的控制器方法上的[ValidateAntiForgeryToken] 属性有关。出于测试目的,我将其删除并开始工作。
    【解决方案3】:

    试试这个。

    [HttpPost]
        public async Task<IActionResult> UploadFile([FromForm]IFormFile file)
        {
            var model = await _filesService.UploadFile(file);
            return Ok();
        }
    

    并移除 ApiController 属性

    【讨论】:

    • 这实际上让我可以达到终点。现在唯一的问题是file 为空。但这比我以前的要好。
    【解决方案4】:

    在 Postman 客户端中尝试以下网址

      http://localhost:5001/api/Files/UploadFile
    

    【讨论】:

    • 这给了我一个 404 Not Found,我发布到正确的 url
    猜你喜欢
    • 2019-05-29
    • 2016-10-19
    • 1970-01-01
    • 2019-10-10
    • 2018-06-30
    • 2020-06-30
    • 2021-11-22
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多