【问题标题】:Powershell New-WebServiceProxy - how to call WCF servicePowershell New-WebServiceProxy - 如何调用 WCF 服务
【发布时间】:2021-01-12 22:25:53
【问题描述】:

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

更新: 我发现了这个blog,它指出:

-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 

现在我收到此错误: 使用“1”参数调用“SetPassKey”的异常:“底层连接已关闭:发生意外错误 接收。”

Web 服务可以由 C# 控制台程序调用,所以我知道它可以工作。只需要从 PowerShell 中调用它。

【问题讨论】:

  • 有没有wsdl后缀的区别在于wsdl可以获取和调用元数据,可以用来创建客户端代理类。这是关于如何使用PowerShell调用WCFService的官方文档:docs.microsoft.com/en-us/powershell/module/…
  • 我当然去过那个页面。它给出了没有类/命名空间的示例 1,以及带有类/命名空间的示例 2。我的一个问题是,如果我有 WSDL,为什么还需要类/命名空间?
  • @TheobaldDu 该页面也未能显示如何构建请求/响应对象;他们的例子只是使用简单的类型。

标签: wcf powershell-4.0


【解决方案1】:

我尝试了一些东西,终于让它工作了。 我确实将我的绑定从 WCF-WSHttp 更改为 WCF-BasicHttp。

我也关注了这个post,它说他们只有通过使用自动生成的命名空间才能让它工作。

我的一个问题最初是使用“/”而不是“。”作为命名空间和 Web 请求/响应类名称之间的分隔符。

我仍然对 -namespace 和 -class 参数感到困惑,因为上面的帖子说它只能通过使用自动生成的命名空间(当你省略 -namespace 参数时发生)来使进程正常工作。

我的代码最终是这样的:

# 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 中的每个返回字符串。

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2017-11-07
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2021-02-11
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多