.NET Web API POST方法在C# WinForm中传参异常(值变为0)求助
问题分析与解决方案
你遇到的核心问题是:Web API 默认不会自动从 JSON 请求体中解析多个独立的简单类型参数。客户端通过PostAsJsonAsync将匿名对象序列化到请求体,但API的两个int参数默认会尝试从URL查询字符串或表单数据中获取值,自然无法拿到请求体里的内容,所以参数值都是默认的0。
以下是两种可行的解决方法:
方案1:创建实体类接收参数(推荐)
定义一个与客户端传参结构匹配的模型类,让API通过这个类接收请求体中的JSON数据,框架会自动完成解析:
API端代码修改
// 先定义请求模型类 public class UpdatePercentageRequest { public int PlayerId { get; set; } public int Percentage { get; set; } } [HttpPost] [Route("UpdatePercentage")] public void UpdatePercentage([FromBody] UpdatePercentageRequest request) { // 使用 request.PlayerId 和 request.Percentage 进行业务处理 ... }
客户端调用代码修改
保持匿名类型传参即可,注意属性名要和API模型类的属性名匹配(大小写不敏感,建议统一风格):
var userid = 2; var percentageText = 21; var response = await client.PostAsJsonAsync("UpdatePercentage", new { PlayerId = userid, Percentage = percentageText });
方案2:用ValueTuple配合[FromBody]接收参数
如果不想创建额外的模型类,可以用ValueTuple包装参数,并给参数添加[FromBody]属性(注意:一个POST方法只能有一个[FromBody]参数):
API端代码修改
[HttpPost] [Route("UpdatePercentage")] public void UpdatePercentage([FromBody] (int PlayerId, int Percentage) request) { // 使用 request.PlayerId 和 request.Percentage 进行业务处理 ... }
客户端调用代码修改
给ValueTuple指定字段名,确保序列化后字段名与API端匹配:
var userid = 2; var percentageText = 21; var response = await client.PostAsJsonAsync("UpdatePercentage", (PlayerId: userid, Percentage: percentageText));
额外提示
- 客户端设置的
Accept头是指定期望接收的响应格式,与请求体格式无关;PostAsJsonAsync会自动设置请求的Content-Type为application/json,这部分配置是正确的。 - 不要尝试给两个独立的
int参数都添加[FromBody],Web API不支持从请求体中解析多个独立的简单类型参数。
内容的提问来源于stack exchange,提问作者repinSlun
相关产品推荐
相关产品推荐

