我正在尝试从PowerShell调用WCF服务。
这是我迄今为止在网上发现的几个错误例子:
# Create the WebSvcURL variable and pass the WSDL URL
$WebSvcURL= “http://localhost/DEMO/SetPassKey/SetPassKey_Logic_SetPassKeyWebService_SetPassKeyWCF.svc?wsdl“
#Create the Web Service Proxy Object
#$serviceProxy = New-WebServiceProxy -Uri $WebSvcURL -Namespace "http://Sample.SetPassKey.Logic" -Class Program -UseDefaultCredential
$serviceProxy = New-WebServiceProxy -Uri $WebSvcURL -UseDefaultCredential
# Create Request Object
$namespace = $serviceProxy.getType().namespace
write-host "Namespace=$namespace"
$req = New-Object ($namespace + "/SetPassKeyOrchWebRequest")
$resp = New-Object ($namespace + "/SetPassKeyOrchWebResponse")
$req.NewPassKey = "TEST" # <--- PUT YOUR NEW PASSWORD HERE
$resp = $serviceProxy.SetPassKey($req)
$resp
我对一些事情感到困惑:
- 如果和何时需要在上包含-Namespace和-Class参数。由于它查看WSDL,我不明白为什么它需要-Namespace和-Class
- 如何构造请求/响应对象
- URL应该是web服务的实际URL,还是应该包括?wsdl后缀
更新:我发现了这个博客,上面写着:
-Namespace参数是可选的,如果不是指定,则从cmdlet中获取一个随机值。
我原以为这是一个XML命名空间,但它是一个.NET框架命名空间。
# Create the WebSvcURL variable and pass the WSDL URL
$WebSvcURL= “http://localhost/DEMO/SetPassKey/SetPassKey_Logic_SetPassKeyWebService_SetPassKeyWCF.svc?wsdl“
#Create the Web Service Proxy Object
$serviceProxy = New-WebServiceProxy -Uri $WebSvcURL -UseDefaultCredential -Namespace "MyNamespace" -Class Program
# Create Request Object
$req = New-Object ("MyNamespace.SetPassKeyOrchWebRequest")
$resp = New-Object ("MyNamespace.SetPassKeyOrchWebResponse")
$req.NewPassKey = "TEST" # <--- PUT YOUR NEW PASSWORD HERE
$resp = $serviceProxy.SetPassKey($req)
$resp
现在我得到这个错误:异常调用";SetPassKey";用";1〃;自变量:";基础连接已关闭:在接收">
Web服务可以由C#控制台程序调用,所以我知道它是有效的。只需要从PowerShell调用它。
我尝试了一些方法,最终成功了。我确实将绑定从WCF WSHttp更改为WCF BasicHttp。
我还关注了这篇文章,文章说他们只是通过使用自动生成的命名空间来实现它。
我最初的问题之一是使用"/"而不是"作为命名空间和web请求/响应类名之间的分隔符。
我仍然对-namespace和-class参数感到困惑,正如上面的帖子所说,它只是通过使用自动生成的命名空间(当您省略-namespace parm时会发生这种情况(来让进程工作。
我的代码最终是这样的:
# Create the WebSvcURL variable and pass the WSDL URL
$WebSvcURL= “http://localhost/DEMO/SetPassKey/SetPassKey_Logic_SetPassKeyWebService_SetPassKeyWCF.svc?wsdl“
#Create the Web Service Proxy Object
$serviceProxy = New-WebServiceProxy -Uri $WebSvcURL -UseDefaultCredential
$autoGenNamespace = $serviceProxy.getType().namespace
write-host "Namespace=$namespace"
$req = New-Object ($autoGenNamespace + ".SetPassKeyOrchWebRequest")
$resp = New-Object ($autoGenNamespace + ".SetPassKeyOrchWebResponse")
$req.NewPassKey = "TEST" # <--- PUT YOUR NEW PASSWORD HERE
$req.NewPassKey = "TEST" # <--- PUT YOUR NEW PASSWORD HERE
Write-Host "Request:"
Write-Host ($req | Format-Table | Out-String)
Write-Host "About to call WebService"
$resp = $serviceProxy.SetPassKey($req)
Write-Host "Response:"
Write-Host ($resp | Format-Table | Out-String)
注意:仅仅把变量名放在没有write-host语句的地方,就会导致事情以不同的顺序出现。FormatTable仍在截断一些字段,所以我将在$resp中分别列出每个返回字符串。