C#客户端调用Minimal API出现UnsupportedMediaType错误的解决方法
问题原因分析
你的Minimal API默认仅支持JSON格式的请求体(Postman发送JSON正常验证了这一点),但C#客户端实际发送的是application/x-www-form-urlencoded格式的表单数据,同时错误地配置了Accept头(该头用于声明客户端接受的响应格式,而非请求体格式),导致服务端无法识别请求体类型,返回UnsupportedMediaType错误。
解决方案
方案一:修改C#客户端发送JSON请求
这是最直接的方式,和Postman的请求逻辑保持一致:
// 构造与API端匹配的数据结构 var rabbitMsg = new { exchange = "system", routingkey = routingkey, message = message }; // 将对象序列化为JSON字符串 string jsonContent = System.Text.Json.JsonSerializer.Serialize(rabbitMsg); // 创建JSON请求内容,指定Content-Type为application/json var content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json"); // 发送POST请求 var response = await Client.PostAsync("/sendmessage", content);
方案二:修改API支持表单格式请求
如果业务需要兼容表单格式请求,可以在API端添加表单绑定支持:
- 确保项目已引用
Microsoft.AspNetCore.Mvc.Core包 - 在参数上添加
[FromForm]特性,指定从表单绑定数据:
app.MapPost("/sendmessage", ([FromForm] RabbitMessage rm) => server.SendMessage(rm.exchange, rm.routingkey, rm.message)); app.Run(); record RabbitMessage(string exchange, string routingkey, string message);
修改后,你原来的FormUrlEncodedContent客户端代码即可正常工作,但此时Postman发送JSON请求会失效,如需同时支持两种格式,需额外处理参数绑定逻辑(不推荐,建议统一请求格式)。
补充说明
Content-Type头用于告诉服务端请求体的格式,Accept头用于声明客户端接受的响应格式,二者不要混淆。- Minimal API默认使用
System.Text.Json进行序列化/反序列化,客户端用相同组件序列化可避免格式兼容问题。
内容的提问来源于stack exchange,提问作者Serve Laurijssen
相关产品推荐
相关产品推荐

