Invoke-RestMethod将复杂类型对象发布为Body不起作用

时间:2014-09-12 05:23:36

标签: powershell

我正在使用PowerShell V4,使用Invoke-RestMethod命令:

Add-Type @"
    using System;

    public class Person{
        public Guid Id {get;set;}
        public string Name {get;set;}
        public int Age {get;set;}
    }
"@
$person = New-Object Person
$person.Age = [int]::(Get-Random -Maximum 99 -Minimum 20)
$person.Name = [string]::("Test" + (Get-Random -Minimum 10 -Maximum 100))

Invoke-RestMethod -Uri "http://localhost:51624/api/personapi" -Method Post -Body $person

在服务器端,

[HttpPost]
public IHttpActionResult Post(Person person)
{
    ...

    return Ok();
}

服务器端收到的person对象是默认的所有属性,例如Age0Namenull。如果我将$person更改为@{Name="..."; Age=11},那就没关系。

我想错过什么,我想保留班级定义吗?

2 个答案:

答案 0 :(得分:2)

您的投射方法似乎有误,您应该使用:

$person.Age = [int](Get-Random -Maximum 99 -Minimum 20)
$person.Name = [string]("Test" + (Get-Random -Minimum 10 -Maximum 100))

然后the doc声明invoke-restmethod的body参数必须实现 IDictionary (通常是哈希表)。因此,您必须将psobject转换为哈希表。 您可以使用the solution given by @Keith Hill

$ht2 = @{}
$person.psobject.properties | Foreach { $ht2[$_.Name] = $_.Value }

答案 1 :(得分:0)

根据您发布的代码,问题出在[int]::[string]::上。我想你想要施展

$person.Age = [int](Get-Random -Maximum 99 -Minimum 20)
$person.Name = [string]("Test" + (Get-Random -Minimum 10 -Maximum 100))

但您使用的是双冒号运算符(静态成员访问器)。只需删除双冒号即可解决问题。