我可以使用PowerShell的New-WebServiceProxy过滤基于WSDL的SOAP查询,只发送一个参数吗?

时间:2013-01-02 15:13:46

标签: web-services powershell

问题:对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),但是生成的param对象不能被$ wsproxy.getRecords($ param)调用接受。另外,我无法直接添加本机属性,只能添加NoteProperties。恢复使用原始param对象,我可以删除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)
}

1 个答案:

答案 0 :(得分:1)

我不确定这是否适用于您的要求与否,但在遵循这些说明之前,我无法成功与ServiceNow Web服务进行交互。

https://wiki.servicenow.com/index.php?title=Microsoft_.NET_Web_Services_Client_Examples

基本上,您正在生成.NET Web客户端,您需要取消选中该URL中的要求中指定的框。

希望这有帮助!