如何将多部分/表单数据发送到 ASP.NET Core Web API?

mrc*_*ode 15 c# asp.net asp.net-core asp.net-core-webapi

我正在尝试将图像和文本字段发送到 API 端点,但收到了

不支持的内容类型 'multipart/form-data; 边界=---------------------------81801171514357

这是一个 ASP.NET Core 2.1 Web API。我有这个:

[HttpPost("/api/account"), Authorize]
public void SaveUser(UserModel info)
Run Code Online (Sandbox Code Playgroud)

还有我的模型:

    [JsonProperty(PropertyName = "avatar")]
    [DataType(DataType.Upload)]
    public IFormFile Avatar { get; set; }

    [JsonProperty(PropertyName = "name")]
    [DataType(DataType.Text)]
    public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我使用axios

    var formData = new FormData();
    formData.append("avatar", imageFile);
    formData.append("name", name);
    axios.post("/api/account", formData);
Run Code Online (Sandbox Code Playgroud)

我希望这个方法能运行,而不是抛出异常。但是如何?我试图添加:

[Consumes("application/json", "multipart/form-data")]
Run Code Online (Sandbox Code Playgroud)

但没有成功。

然后我尝试:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)
Run Code Online (Sandbox Code Playgroud)

该方法运行,但信息对象上的属性为空:(

更新: 解决方案,不要使用 JsonProperty PropertyName。使用变量名。

joo*_*tas 20

也许你应该尝试用[FromForm]属性装饰控制器输入和模型?在此处查看更多信息:web api 参数绑定

在给定的示例中,您的控制器操作应如下所示:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)
Run Code Online (Sandbox Code Playgroud)

在模型中:

[FromForm(Name="avatar")]
public IFormFile Avatar { get; set; }

[FromForm(Name="name")]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 使用应在控制器操作和模型定义中使用 [FromForm] 属性。至少这对我有用。 (2认同)
  • 这救了我的命!我为这个问题彻夜难眠。非常感谢@joostas (2认同)