You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6+Angular13密码更新接口报415不支持媒体类型错误

解决ASP.NET Core 6 Web API + Angular 13密码更新接口415错误

错误根源

你的API接口通过[FromBody]期望接收JSON格式的请求体,但Angular前端用FormData发送的是multipart/form-data格式,两者媒体类型不匹配,导致415 Unsupported Media Type错误。此外还存在两处关键问题:

  • 字段不匹配:API的ChangePassword模型需要Email、CurrentPassword、NewPassword、ConfirmNewPassword字段,但Angular只传了oldPassword和newPassword
  • API逻辑错误:result.Succeeded为true时错误返回500状态码,与实际成功结果矛盾

方案一:Angular改为发送JSON(推荐)

REST API通常以JSON为默认交互格式,此方案更符合规范:

1. 修改Angular Service代码

替换FormData为JSON对象,补充API所需的完整字段(注意字段名与API模型严格匹配):

UpdatePassword(email: string, oldPassword:string, newPassword:string, confirmNewPassword:string): Observable<any>{
  const body = {
    Email: email,
    CurrentPassword: oldPassword,
    NewPassword: newPassword,
    ConfirmNewPassword: confirmNewPassword
  };
  return this.http.put<any>(`${this.baseUrl}/Change-password`, body)
    .pipe(catchError(this.errorHandler));
}

2. 修改Angular组件TS代码

传递完整参数(用户邮箱可从登录态中获取,比如localStorage或AuthService):

updatePassword(form: any) {
  const oldPassword = form.value.oldPassword;
  const newPassword = form.value.newPassword;
  const reNewPassword = form.value.reNewPassword;
  // 示例:从本地存储读取当前用户邮箱
  const userEmail = localStorage.getItem('userEmail') || '';

  if (newPassword !== reNewPassword) {
    this.has_error = true;
    this.password_update_msg = '新密码和确认密码必须一致';
    return;
  }

  this.userService.UpdatePassword(userEmail, oldPassword, newPassword, reNewPassword)
    .subscribe(() => {
      this.has_error = false;
      this.password_update_msg = '密码更新成功,请重新登录!';
      form.reset();
    },
    () => {
      this.has_error = true;
      this.password_update_msg = '密码更新失败!';
    });
}

方案二:API改为接收FormData

若坚持使用FormData发送请求,需调整API的接收方式:

1. 修改API控制器代码

将[FromBody]改为[FromForm],同时修正状态码逻辑:

[HttpPut]
[Route("Change-password")]
public async Task<IActionResult> ChangePassword([FromForm] ChangePassword model)
{
    var user = await userManager.FindByEmailAsync(model.Email);

    if (user == null)
    {
        return StatusCode(StatusCodes.Status404NotFound, new Response { Status = "Error", Message = "用户不存在" });
    }

    if (string.Compare(model.NewPassword, model.ConfirmNewPassword) != 0)
    {
        return StatusCode(StatusCodes.Status400BadRequest, new Response { Status = "Error", Message = "新密码和确认密码不匹配" });
    }

    var result = await userManager.ChangePasswordAsync(user, model.CurrentPassword, model.NewPassword);

    if (result.Succeeded)
    {
        // 修正:成功返回200状态码
        return Ok(new Response { Status = "Success", Message = "密码修改成功" });
    }
    else
    {
        var errors = string.Join(", ", result.Errors.Select(e => e.Description));
        return StatusCode(StatusCodes.Status400BadRequest, new Response { Status = "Error", Message = $"修改失败:{errors}" });
    }
}

2. 修改Angular Service的FormData键名

确保键名与API模型字段完全一致:

UpdatePassword(email: string, oldPassword:string, newPassword:string, confirmNewPassword:string): Observable<any>{
  const body= new FormData();
  body.append('Email', email);
  body.append('CurrentPassword', oldPassword);
  body.append('NewPassword', newPassword);
  body.append('ConfirmNewPassword', confirmNewPassword);
  return this.http.put<any>(`${this.baseUrl}/Change-password`, body )
    .pipe(catchError(this.errorHandler));
}

内容的提问来源于stack exchange,提问作者salah kimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:05:21