我正在尝试使用Powershells Invoke-Webrequest将肥皂信封发送到受密码保护的Web服务。密码包含'£'字符,这会导致以下错误:
Invoke-WebRequest ...The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:password. The InnerException message was 'There was an error deserializing the object of type System.String. '�inthemiddle' contains invalid UTF8 bytes.'. Please see InnerException for more details.</faultstring></s:Fault></s:Body></s:Envelope>
这是脚本(已删除敏感信息):
[xml]$SOAP = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:MethodName>
<tem:password>passwordtextwit£inthemiddle</tem:password>
</tem:MethodName>
</soapenv:Body>
</soapenv:Envelope>'
$headers = @{"SOAPAction" = "http://tempuri.org/service/MethodName"}
$URI = "https://<MY URI.com>/service.svc"
$out = Invoke-WebRequest $uri -Method post -ContentType 'text/xml' -Body $SOAP -Headers $headers
我强迫$ SOAP使用什么类型/编码似乎无关紧要,Invoke-Webrequest坚持将'£'解释为' '。
有什么想法吗?
答案 0 :(得分:3)
它当然看起来像编码问题,所以这里有一些你可以尝试的东西。
确保您的文件保存为UTF-8。使用notepad.exe打开它,然后选择另存为。在底部有一个“编码”下拉列表。应该说是UTF-8。如果没有,请更改它并覆盖该文件。
在Powershell中,使用type
或get-content
命令打印文件。英镑符号应显示为英镑符号,而不是问号。
使用记事本(或其他编辑器)以正确的编码保存它应该解决这个问题。
另一件可能有用的事情是将SOAP消息存储在一个编码为UTF-8(或Unicode)的单独文件中。
然后使用-Encoding参数和您保存的类型使用Get-Content
获取文件的内容。
同样,这是为了确保英镑符号在服务调用中使用之前不会被破坏。
如果这不起作用,也许你可以使用Read-Host
获取密码并使用它来组合SOAP消息。
最后,您始终可以更改密码,使其在unicode范围内没有字符。只要它们处于较低的ASCII范围内,您仍然可以使用一堆特殊字符。例如。 %= + - )ç!“#等 但这是我猜的最后一招。