Powershell新WebServiceProxy-如何调用WCF服务



我正在尝试从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 

我对一些事情感到困惑:

  1. 如果和何时需要在上包含-Namespace和-Class参数。由于它查看WSDL,我不明白为什么它需要-Namespace和-Class
  2. 如何构造请求/响应对象
  3. 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中分别列出每个返回字符串。

最新更新