簡體   English   中英

發布 IFormFile 時出現錯誤請求 (400)

[英]Bad Request (400) when posting IFormFile

我有一個 .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 中的設置:

在此處輸入圖片說明

我一直在旋轉我的輪子試圖找出問題所在,但這根本沒有什么,我正在遵循我在網上看到的例子。

我究竟做錯了什么?

我看到您已經設置了[ApiController]屬性,所以我假設您正在運行 ASP.Net Core 2.1。

如果尚未設置,請嘗試將services.AddMvc()修改為services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); 在 Startup.cs 中。

不久前我遇到了類似的問題,上述更改為我修復了它。 我在這里找到了我的問題的答案。

希望這可以幫助!

嘗試這個。

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

並刪除 ApiController 屬性

我在嘗試通過 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] 添加到當前控制器或端點方法。

希望這在未來可以免除某些人的頭疼! 我在這上面浪費了很多時間......

在郵遞員客戶端嘗試以下網址

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM