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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:55:15