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

PowerShell调用API时Body反序列化失败,控制器参数为空求助

解决思路

1. 修正请求的Content-Type

ASP.NET Web API 默认优先识别 application/json 作为JSON请求的内容类型,你当前使用的 text/json 可能导致模型绑定逻辑无法正确解析请求体。修改PowerShell代码中的ContentType参数:

$body='[{"Criteres":[{"Nom":"Code","Valeur":"lyon"},{"Nom":"Libellé","Valeur":"lyon test"}],"Nom":"X_Site_Geogr","Pseudo":"Site Géographique"}]'
$url="http://localhost/api/OccObjets/"
$Responseappli = Invoke-WebRequest -URI $url -Method "PUT" -Body $body -ContentType "application/json" -UseDefaultCredentials
Write-Output $Responseappli.Content

2. 正确序列化PowerShell哈希表为JSON

你用哈希表构造Body时存在两个问题:一是哈希表数组内的元素缺少逗号分隔,二是未将哈希表转换为标准JSON字符串。需使用 ConvertTo-Json 处理,同时指定足够的深度避免嵌套结构被截断:

$bodyObject = @(
    @{
        "Nom"="X_Site_Geogr"
        "Pseudo"="Site Géographique"
        "Criteres"= @(
            @{
                "Nom"="Code"
                "Valeur"="lyon"
            },
            @{
                "Nom"="Libellé"
                "Valeur"="lyon test2"
            }
        )
    }
)
# 转换为JSON,指定深度确保嵌套结构完整
$body = $bodyObject | ConvertTo-Json -Depth 10

$url="http://localhost/api/OccObjets/"
$Responseappli = Invoke-WebRequest -URI $url -Method "PUT" -Body $body -ContentType "application/json" -UseDefaultCredentials
Write-Output $Responseappli.Content

3. 确保请求体为UTF-8编码

ASP.NET Web API 默认期望UTF-8编码的JSON内容,PowerShell的Invoke-WebRequest有时会用系统默认编码(如GB2312),导致解析异常。可以手动将JSON转换为UTF-8字节数组发送:

$body='[{"Criteres":[{"Nom":"Code","Valeur":"lyon"},{"Nom":"Libellé","Valeur":"lyon test"}],"Nom":"X_Site_Geogr","Pseudo":"Site Géographique"}]'
$bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($body)
$url="http://localhost/api/OccObjets/"
$Responseappli = Invoke-WebRequest -URI $url -Method "PUT" -Body $bodyBytes -ContentType "application/json; charset=utf-8" -UseDefaultCredentials
Write-Output $Responseappli.Content

4. 验证后端模型绑定配置

确认后端Web API的JSON序列化配置与请求体格式匹配:

  • 如果使用Newtonsoft.Json(Json.NET),确保全局配置正确(默认通常没问题,但可检查):
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // 确保JSON格式化器使用Newtonsoft.Json
            config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
            {
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
                // 如果后端模型属性是camelCase,需启用以下配置;PascalCase则无需
                // ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            };
        }
    }
    
  • 如果使用System.Text.Json,需确保属性名称匹配(如PowerShell生成的是PascalCase,后端模型也应为PascalCase,或配置序列化器忽略大小写)。

内容的提问来源于stack exchange,提问作者user1069516

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:10:27