使用-Namespace时New-WebServiceProxy cmdlet中的错误?

时间:2012-01-05 16:31:59

标签: wcf powershell powershell-v2.0

所以我遇到了这个问题:http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.html

问题的要点是,当使用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的正确方法。任何人都可以为我阐明这一点吗?

2 个答案:

答案 0 :(得分:8)

实际上你看到的东西更微妙。使用-Namespace,您无法在命名空间中执行该类型的参数

我怀疑你正在创建New-WebServiceProxy,例如,在函数的进程块中,或者在重复调用的命令内部。每次调用它时,它都会尝试重新生成,并且使用-Namespace,这会在AppDomain中与关联类型产生很少的冲突。最终有几个,你得到这个错误。

有两种解决方法:

  • 确保每个AppDomain只导入一次。在像PowerGUI或ISE这样的东西中,这可能比它听起来更难,因为不仅有你想到的运行空间(比如打开标签),而且还有你没有的运行空间(比如那些通过添加启动的运行空间,或者进行中的工作)
  • 远比“更容易”,但更加神秘的解决方法是简单地创建相对于特定命名空间的类型。

这比告诉要容易得多。

我在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相关的内容并再次打开