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
相关产品推荐
相关产品推荐

