Powershell 新WebServiceProxy失败,出现InvalidOperationException

Powershell 新WebServiceProxy失败,出现InvalidOperationException,powershell,soap,wsdl,Powershell,Soap,Wsdl,我正在尝试将一个工作的SOAP客户端(用Perl编写)移植到另一个客户端的PowerShell中(该客户端不允许我们用Perl污染其锁定的windows环境) 因此,我尝试下载WSDL信息来创建代理,使用我在Web上找到的示例。这就是现有Perl代码的工作方式,因此这种方法是合理的 $soap=newWebServiceProxy-Uri$url-UseDefaultCredential New-WebServiceProxy : The HTML document does not conta

我正在尝试将一个工作的SOAP客户端(用Perl编写)移植到另一个客户端的PowerShell中(该客户端不允许我们用Perl污染其锁定的windows环境)

因此,我尝试下载WSDL信息来创建代理,使用我在Web上找到的示例。这就是现有Perl代码的工作方式,因此这种方法是合理的

$soap=newWebServiceProxy-Uri$url-UseDefaultCredential

New-WebServiceProxy : The HTML document does not contain Web service discovery information.
At line:1 char:9
+ $soap = New-WebServiceProxy -Uri $uri
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (http://localhos...sx:Uri) [New-WebServiceProxy], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.NewWebServiceProxy
但是,正如我所说的,这是基于工作代码的,因此服务器端不太可能出现任何错误。作为测试,输入

$WebResponse=调用WebRequest-使用DefaultCredential$url

$WebResponse

我得到:

StatusCode        : 200
StatusDescription : OK
Content           : `<?xml version="1.0" encoding="UTF-8"?>

                    <!-- SOAP API definitions -->
                    <definitions name="SOAPAPI"
StatusCode:200
状态描述:OK
内容:`

简短的回答-放弃。它不起作用。作为一种解决方法,使用invokewebrequest-OutFile下载WSDL(这很重要),并使用本地文件Uri调用新的Webserviceproxy。如果需要身份验证,请根据需要手动设置凭据或UseDefaultCredentials属性(将参数设置为New Webserviceproxy没有任何效果)。它现在可以工作了,但我必须得出结论,底层的.NETC#代码除了MS服务外,从未用任何东西进行过测试

无论如何,这就是解决方案:


$tmp=新的临时文件
$tmpName=$tmp.FullName
#将所有参数分散到cmdlet比混合使用命令行更具可读性
#和飞溅参数
$wsdlArgs=@{
Uri=-join($Uri',?trid=',$service)
OutFile=$tmpName
PassThru=$true
ErrorAction='停止'
}
if($Credential-eq[System.Management.Automation.PSCredential]::空){
$wsdlArgs['UseDefaultCredentials']=$true
}
否则{
$wsdlArgs['Credential']=$Credential
}
$wsdlResponse=Invoke WebRequest@wsdlArgs#此处无try/catch-如果失败,我们将失败!
#将所有参数分散到cmdlet比混合使用命令行更具可读性
#和飞溅参数
$soapArgs=@{
Uri=([System.Uri]($tmpName)).AbsoluteUri
类='SOAPAPI'
Namespace=“www.kambe.com.au”
ErrorAction='停止'
}
试一试{
$soap=New-webservicecoproxy@soapArgs#无catch块,如果cmdlet失败,我们就失败!
}
最后{#无论cmdlet成功还是失败,我们都会删除临时文件
删除项目$tmpName-强制
}
#如果未使用,新WebServiceProxy似乎会忽略凭据和UseDefaultCredential参数?
#编程实用主义:它以这种方式工作,而不是任何其他方式
if($Credential-eq[System.Management.Automation.PSCredential]::空){
$soap.UseDefaultCredentials=$true
}
否则{
$soap.Credentials=$Credential
}

暗箭伤人:将
?wsdl
添加到
$uri
的值中是否有帮助?在本例中,没有。我们知道uri是正确的-它是由现有Perl代码生成的,我们将wsdl作为Invoke-WebRequest中的内容返回。您的变量是$uri还是$url?错误与您的代码不同您看过这篇文章了吗?对不起,那里有个打字错误。变量是$url,在我的PS历史记录中是conistent。