使用Invoke-RestMethod调用Azure WebHook时Headers参数绑定失败问题
这个错误的核心原因很明确:Invoke-WebRequest的Headers参数需要接收哈希表(Hashtable)或字典(IDictionary)类型的对象,但你可能不小心把Headers转换成了JSON字符串——毕竟你提到在脚本末尾把内容转成了JSON,大概率是误操作把Headers也转成JSON格式了,而PowerShell没法把JSON字符串直接解析成Headers需要的键值对结构。
具体排查和修复步骤:
先确认Headers的类型:你最初用Invoke-RestMethod正常时,
$webhook_headers应该是类似这样的哈希表:$webhook_headers = @{ "ocp-apim-subscription-key" = "your-key-here" # 其他需要的请求头 }绝对不能是经过
ConvertTo-Json处理后的字符串,一旦转成JSON,它就变成了纯文本,不再是PowerShell能识别的键值对集合。只对Body进行JSON转换:如果你的WebHook要求Body是JSON格式,只需要单独转换Body部分,同时记得指定Content-Type(可以直接用
-ContentType参数,或者加到Headers里):# 保持Headers为哈希表,不要转JSON $webhook_headers = @{ "ocp-apim-subscription-key" = "your-key-here" } # 仅转换Body为JSON字符串,-Depth参数根据你的对象层级调整 $json_body = $Body | ConvertTo-Json -Depth 10 # 正确调用Invoke-WebRequest Invoke-WebRequest -Uri $webhook_url -Headers $webhook_headers -Method $webhook_method -Body $json_body -ContentType "application/json"排查脚本末尾的操作:检查你是不是在脚本最后做了类似
$webhook_headers = ConvertTo-Json $webhook_headers的操作,这会直接破坏Headers的类型。如果有,删掉这行,保持Headers的哈希表结构。
另外补充一点:Invoke-RestMethod其实会自动处理JSON Body的序列化(如果Body是对象的话),但Invoke-WebRequest更“底层”,需要你手动处理Body的格式和Content-Type头,这也是两者的一个小区别。
内容的提问来源于stack exchange,提问作者Antoine Giraud

