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

dev*_*ife 12 powershell wcf powershell-2.0

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

问题的要点是,在使用New-WebServiceProxy cmdlet -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)
Run Code Online (Sandbox Code Playgroud)

这引发了一个例外 Cannot convert argument "0" of type "ns.DoSomething" to type "ns.DoSomething"

正如链接中所解释的那样,通过删除-Namespace参数并使用自动生成的命名空间,一切正常.但是,我真的想使用-Namespace ....

我无法找到任何与"修复"相关的内容或在此方案中使用-Namespace的正确方法.任何人都可以为我阐明这一点吗?

Sta*_*ing 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"
}
Run Code Online (Sandbox Code Playgroud)

这显然有点神秘,但是,Exchange Web Services也是如此.许多Web服务也是直接从复杂对象模型构建的.

不幸的是,这是New-WebServiceProxy使用的绝大多数Web服务.

请记住,缓存您在模块中创建的Web服务对象(使用$script:variablename上面的方法)仍然是一种很好的做法,但是通过代理对象引用Web服务部分的这种奇怪技巧比我想要的多得多.

希望这可以帮助


And*_*huk 3

您是否在某个编辑器中运行代码?从 PowerGUI 编辑器运行脚本时我遇到了类似的问题,但当我从控制台运行它时它对我来说工作正常。尝试关闭所有与 powershell 相关的内容并再次打开它