调用MVC Core API时出现415 Unsupported Media Type错误求助
解决WPF向ASP.NET Core API发送POST请求时的415 Unsupported Media Type错误
看起来你遇到的问题核心是ASP.NET Core API无法正确解析你发送的表单格式请求,导致请求没到达控制器就返回了415错误。咱们一步步来排查和解决:
首先修正控制器Action的配置
你粘贴的控制器代码明显有误(里面重复了WPF端的请求逻辑,这显然不是处理API请求的代码),先假设你的控制器Action是用来验证用户名密码并返回Token的,正确的配置需要包含以下关键点:
1. 控制器和Action的路由与HTTP方法标记
确保控制器带有[ApiController]和路由特性,Action明确标记为[HttpPost]:
[Route("api/[controller]")] [ApiController] public class TokenController : ControllerBase { // 明确处理POST请求,参数来自表单请求体 [HttpPost] public async Task<IActionResult> LoginAsync([FromForm] string userName, [FromForm] string password) { // 这里替换成你的真实验证逻辑 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { // 生成Token的逻辑 var token = "your-generated-token-here"; return Ok(new TokenWrapper { Token = token }); } return Unauthorized("用户名或密码错误"); } }
2. 参数绑定源的关键:[FromForm]
你的WPF端发送的是application/x-www-form-urlencoded格式的请求,必须给控制器的参数加上[FromForm]特性,告诉ASP.NET Core从表单请求体中读取参数值。如果没有这个标记,默认情况下ASP.NET Core可能会尝试从查询字符串中获取参数,导致无法解析请求体,进而返回415错误。
验证WPF端的请求代码
你的WPF端代码其实是正确的,FormUrlEncodedContent会自动设置正确的Content-Type: application/x-www-form-urlencoded请求头,参数名也和控制器的userName、password完全匹配,不需要修改:
var formContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("userName", userName), new KeyValuePair<string, string>("password", password) }); var resp = await _client.PostAsync("api/Token", formContent); var json = await resp.Content.ReadAsStringAsync(); var tw = JsonConvert.DeserializeObject<TokenWrapper>(json); return tw.Token;
备选方案:改用JSON格式请求
如果你更倾向于用JSON格式发送请求(也就是你注释掉的那段代码),可以按以下方式调整:
1. 创建请求模型类
public class LoginRequest { public string UserName { get; set; } public string Password { get; set; } }
2. 修改控制器Action接收JSON参数
[HttpPost] public async Task<IActionResult> LoginAsync([FromBody] LoginRequest request) { if (request == null) return BadRequest("请求参数为空"); // 验证逻辑 if (request.UserName == "valid-user" && request.Password == "valid-pass") { var token = "your-generated-token-here"; return Ok(new TokenWrapper { Token = token }); } return Unauthorized(); }
3. WPF端发送JSON请求
var loginModel = new { UserName = userName, Password = password }; var jsonString = JsonConvert.SerializeObject(loginModel); var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); var resp = await _client.PostAsync("api/Token", content); var json = await resp.Content.ReadAsStringAsync(); var tw = JsonConvert.DeserializeObject<TokenWrapper>(json); return tw.Token;
额外排查点
- 确保你的API项目已经启用了控制器路由:在
Program.cs(.NET 6+)中包含builder.Services.AddControllers();和app.MapControllers();代码 - 检查请求的完整URL是否正确,比如API的基地址是否和
_client的BaseAddress匹配 - 可以用Postman等工具先测试API接口,确认接口本身能正常接收请求,再排查WPF端的问题
内容的提问来源于stack exchange,提问作者ProfK
相关产品推荐
相关产品推荐

