问题的要点是,当使用New-WebServiceProxy cmdlet AND -Namspace参数时,您无法使用自动生成类型的参数在代理上执行方法。
这样的事情:
// In the service
public void DoSomething(DoSomethingRequest request) { ... }
$proxy = New-WebServiceProxy -Uri "http://something.com/MyService.svc"
-Namespace ns
$req = New-Object ns.DoSomethingRequest
$proxy.DoSomething($req)
这会引发Cannot convert argument "0" of type "ns.DoSomething" to type "ns.DoSomething"
正如链接中所解释的那样,通过删除-Namespace参数并使用自动生成的命名空间,一切正常。但是,我真的想使用-Namespace ....
在这种情况下,我无法找到与“修复”相关的任何内容或使用-Namespace的正确方法。任何人都可以为我阐明这一点吗?
答案 0 :(得分:8)
实际上你看到的东西更微妙。使用-Namespace,您无法在命名空间中执行该类型的参数
我怀疑你正在创建New-WebServiceProxy,例如,在函数的进程块中,或者在重复调用的命令内部。每次调用它时,它都会尝试重新生成,并且使用-Namespace,这会在AppDomain中与关联类型产生很少的冲突。最终有几个,你得到这个错误。
有两种解决方法:
这比告诉要容易得多。
我在Office365 / Exchange Web服务的模块中遇到了这个问题,而且,它有以下内容:
$createItemType =
New-Object "$script:ExchangeWebServiceNamespace.CreateItemType"
-Property @{
MessageDisposition = $messageDisposition
MessageDispositionSpecified = $true
Items =
New-Object "$script:ExchangeWebServiceNamespace.NonEmptyArrayOfAllItemsType"
}
这显然有点神秘,但是,Exchange Web Services也是如此。许多Web服务也是直接从复杂对象模型构建的。
不幸的是,这是New-WebServiceProxy使用的绝大多数Web服务。
请记住,缓存您在模块中创建的Web服务对象(使用上面的$script:variablename
)仍然是一种很好的做法,但是这个通过代理对象引用Web服务部分的奇怪技巧为我节省了更多比我想要的时间。
希望这有助于
答案 1 :(得分:3)
您是否在某个编辑器中运行代码?从PowerGUI编辑器运行脚本时我遇到了类似的问题,但是当我从控制台运行它时它对我来说很好。尝试关闭所有与powershell相关的内容并再次打开