问题:对 ServiceNow 的 ../cmdb_ci_win_server.do?WSDL 表的所有 Web 服务调用都返回零结果。
原因:我正在使用 PowerShell 的 New-WebServiceProxy 方法,该方法根据 ServiceNow 提供的 WSDL 定义动态创建一个 .NET .dll。WSDL 定义了 174 个参数,我希望只定义和查询其中一个参数,但是在执行时,.dll 总是在其查询的 WHERE 子句中发送其他 173 个空参数,这显然会导致不匹配的情况。
希望:动态 .dll 让我可以创建一个包含 174 个参数的参数对象,然后让我根据需要设置属性。我是否可以以某种方式创建一个仅包含我需要的单个参数的类似对象?我已经尝试使用 $param.PSObject.TypeNames.Insert(0,$paramClassName) 这样做,但是 $wsproxy.getRecords($param) 调用不能接受生成的 param 对象。此外,我无法直接添加本机属性,只能添加 NoteProperties。恢复使用原始参数对象,我可以删除 173 个参数吗?底层对象似乎是不可变的,但也许有一些我从未见过的技巧?
演示代码:
$cred = Get-Credential
$wsproxy = New-WebServiceProxy -uri 'https://snowtest/cmdb_ci_win_server.do?WSDL' -Credential $cred
if ($wsproxy) {
# Force $cred onto the new wsproxy, or it will default to non-authenticated calls
$wsproxy.Credentials = $cred
# The parameter object we'll send with the query must be built from the custom object.
# That requires we extract the class name from the method's parameter definition.
# All my attempts to create a custom query object failed, including forcing the classname.
$overloadDefinitions = $wsproxy.getRecords.OverloadDefinitions
$paramClassName = $overloadDefinitions[0] -ireplace '^[^(]+\(([^ ]+).+$', '$1'
$param = New-Object $paramClassName
$param.host_name = 'ServerName'
$wsproxy.getRecords($param)
}