PowerShell中调用SOAP Web服务:如何创建自定义类方法参数?
解决New-WebServiceProxy调用Opsware Twister时Filter类型转换错误的问题
我之前在处理Opsware Twister的SOAP服务调用时也碰到过一模一样的坑!用New-WebServiceProxy生成代理后,调用findServerRefs方法时,死活传不对com.opsware.search.Filter类型的参数——明明服务文档说要这个类型,但找遍代理的方法也没看到创建Filter的入口,直接传哈希表或者基本类型肯定会报类型转换错误。
其实核心原因是:New-WebServiceProxy会把WSDL里所有的复杂类型(包括Filter这种依赖类)都生成对应的.NET类型,只是没有暴露专门的创建方法而已。我们可以直接用PowerShell的New-Object来实例化这些类型。
具体解决步骤:
先获取服务代理对象
先确保你已经正确生成了代理:$wsdlUrl = "http://your-opsware-twister-url/wsdl/YourService.wsdl" $proxy = New-WebServiceProxy -Uri $wsdlUrl -Namespace "OpswareTwister"创建Filter实例
用New-Object直接创建com.opsware.search.Filter的实例,注意要带上代理生成的命名空间(如果有的话):# 先确认Filter类型的全名,可按需调整命名空间 $filterType = $proxy.GetType().Assembly.GetType("OpswareTwister.com.opsware.search.Filter") $filter = New-Object $filterType要是命名空间没问题,也可以直接简写:
$filter = New-Object OpswareTwister.com.opsware.search.Filter配置Filter的属性
根据Filter类的结构设置对应属性,比如添加具体的搜索条件:# 假设Filter包含Conditions属性,是Condition类型的数组 $conditionType = $proxy.GetType().Assembly.GetType("OpswareTwister.com.opsware.search.Condition") $condition = New-Object $conditionType $condition.Attribute = "serverName" $condition.Operator = "EQUALS" $condition.Value = "web-server-01" $filter.Conditions = @($condition)调用findServerRefs方法
现在把创建好的Filter实例传进去,就不会再报类型转换错误了:$serverRefs = $proxy.findServerRefs($filter)
实用小技巧:
- 如果你不确定目标类型的全名,可以用这条命令查找:
$proxy.GetType().Assembly.GetTypes() | Where-Object { $_.Name -like "*Filter*" } - 对于Filter里嵌套的复杂类型(比如Condition、LogicalOperator等),都可以用同样的
New-Object方式创建实例。
这种方法本质上是直接利用了New-WebServiceProxy生成的.NET类型定义,绕开了服务未暴露创建方法的问题,亲测在Opsware Twister的服务调用中完全可行。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

