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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:59