You need to enable JavaScript to run this app. PowerShell使用New-WebServiceProxy调用SOAP时ns.param对象创建与赋值问题
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell使用New-WebServiceProxy调用SOAP时ns.param对象创建与赋值问题

PowerShell调用SOAP服务param类对象构造失败问题

基础场景

  • 目标SOAP服务运行状态正常,可通过SoapUI完成正常请求调用,无连通性、接口权限问题
  • 参考Technet论坛《Execute SOAP call in PowerShell》、StackOverflow的SOAP复杂类型调用相关内容后,仍无法将参数写入生成的ns.param对象,甚至无法正常实例化ns.param对象
  • 目标服务的核心方法定义如下:
    search   Method  ns.resultats search(string login, string password, ns.entite entite, bool entiteSpecified, ns.searchCriteria criteres, bool details, bool completePath)
    
  • IDE自动补全提示searchCriteria下的critere字段类型为ns.param[],字段提示截图:
    IDE自动补全提示

触发的异常

执行$scParam | Get-Member时触发CLS兼容校验报错,完整报错信息:

gm : Le champ ou la propriété «Value» du type «ns.param» ne diffère que par la casse du champ ou de la propriété «value». Le type doit être compatible avec la spécification CLS (Common Language Specification).
Au caractère C:\Users\edoua\Documents\test.ps1:13 : 12
$scParam | gm
            ~~
CategoryInfo          : NotSpecified: (:) [Get-Member], ExtendedTypeSystemException
FullyQualifiedErrorId : NotACLSComplaintProperty,Microsoft.PowerShell.Commands.GetMemberCommand

报错本质为服务端生成的param类同时存在仅大小写不同的value和Value属性,不符合CLS兼容规范,PowerShell类型系统在反射读取该对象属性时会直接抛出兼容错误。

已验证的同逻辑Python实现

使用Python zeep库构造对应结构即可正常完成请求,入参结构如下:

{
   'login': 'log', 
   'password': 'pass', 
   'entite': 'personne', 
   'criteres': {
      'critere': {
         'name': 'matricule', 
         'value': '001002', 
         'operator': 'eq'
      }, 
      'pageNum': 1, 
      'pageSize': 100
   }, 
   'details': True, 
   'completePath': False
}

现有测试代码的问题点

现有测试代码尝试用哈希表直接赋值给代理类的强类型对象,未匹配类型系统的强类型约束:

$url = "http://localhost:8081/search/V1?WSDL"

$WS = New-WebServiceProxy -Uri $url -Namespace ns
$type = $WS.GetType().NameSpace

# 定义类型全称
$typeSc = $type + '.searchCriteria'
$typeScParam = $type + '.param'

# 实例化对象
$sc = New-Object $typeSc
$scParam = New-Object $typeScParam
# 执行该行直接触发CLS兼容报错
$scParam | gm

# 用哈希表构造参数结构
$crits = @{}

# 单条查询条件
$crit = @{}
$crit["name"] = "matricule"
$crit["operator"] = "eq"
$crit["value"] = "001002"

$crits["critere"] = $crit

# 直接将哈希表赋值给强类型param对象,存在类型不匹配问题
$scParam = $crits

$sc.pageNum = 1
$sc.pageSize = 100
$sc.critere = $scParam

可落地的解决方案

  • 跳过Get-Member属性检查步骤:CLS兼容报错仅在PowerShell反射枚举对象属性时触发,直接对对象属性赋值不会被拦截,完全不需要执行$scParam | gm做属性校验
  • 逐属性给实例化的param对象赋值,不要使用哈希表强转:
    1. 实例化单个param对象后,直接通过属性名赋值(注意大小写匹配服务端生成的属性名,通常为小写的name/operator/value)
    2. 将构造完成的param对象放入数组,再赋值给searchCriteria的critere字段(该字段类型为ns.param[]数组,不是单个对象)
  • 修正后的核心可运行代码片段:
    # 实例化param对象,跳过Get-Member步骤
    $scParam = New-Object $typeScParam
    # 直接逐属性赋值,若提示属性不存在可匹配实际大小写调整
    $scParam.name = "matricule"
    $scParam.operator = "eq"
    $scParam.value = "001002"
    
    # 将单条参数放入数组,匹配ns.param[]的类型要求
    $sc.critere = @($scParam)
    $sc.pageNum = 1
    $sc.pageSize = 100
    
    # 调用服务方法
    $result = $WS.search(
        "log",
        "pass",
        [ns.entite]"personne",
        $true,
        $sc,
        $true,
        $false
    )
    
  • 若赋值时提示找不到对应属性,可通过反射直接绕过CLS校验获取类的属性列表,明确实际属性名:
    [ns.param].GetProperties() | Select-Object Name
    

内容的提问来源于stack exchange,提问作者EMR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 09:45:01