我写了一个小的PowerShell脚本来向服务器发送请求并获得简单的XML结果.
PowerShell脚本
$xml = "<?xml version='1.0' encoding='utf-8'?><Search><ID>278A87E1-1BC2-4E19-82E9-8BBE31D67D20</ID></Search>"
$response = Invoke-RestMethod -Method Post -Uri "http://localhost/search" -ContentType "application/xml" -Body $xml
Run Code Online (Sandbox Code Playgroud)
就是这样,非常简单,我没有理由看到它失败了.我也尝试过脚本Invoke-WebRequest并且都失败了.返回的错误是Invoke-RestMethod : Value cannot be null. Parameter name: name.奇怪的是,当我监视这个时Wireshark,我看到了连接,我看到了POST,我看到了服务器的结果,所有看起来都非常好,但是cmdlet说它失败了(是的,返回代码是200).
如果我使用参数运行Invoke-WebRequest/ ,它运行正常,没有错误,并将结果保存到指定的文件; 如果你想知道就失败了.Invoke-RestMethod-OutFile-OutVariable
结果是一个xml文件,标头指定它是xml并且xml格式正确.
成功时的结果
<?xml version="1.0" encoding="UTF-8" ?>
<Result version="1.0" xmlns="urn:xmlns-org">
<searchID>{278a87e1-1bc2-4e19-82e9-8bbe31d67d20}</searchID>
<responseStatus>true</responseStatus>
<responseStatusStrg>MORE</responseStatusStrg>
<numOfMatches>40</numOfMatches>
</Result>
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么Invoke-XXXcmdlet返回错误以及我可以做些什么来修复它?同样,当我使用-OutFile参数时,它完全正常工作,即使失败,我也可以在脚本和服务器之间看到正确的对话Wireshark.
另外,如果我使用-Verbose它告诉我以下内容:
VERBOSE: POST http://localhost/search with -1-byte payload
VERBOSE: received X-byte response of content type application/xml; charset="UTF-8"
Run Code Online (Sandbox Code Playgroud)
X-byte响应的实际大小在哪里,但根据发送到服务器的数据,每个响应明显不同.我只是觉得奇怪的是cmdlet失败但是它收到了一个带有数据的响应并且它发送了一个-1-byte有效载荷.
van*_*ane 11
我继续查看Invoke-WebRequestcmdlet代码,找出了为什么它失败了这个特殊的错误.
它没有打电话给System.Globalization.EncodingTable.GetCodePageFromName.编码作为参数传递给该函数,并通过Content-Type标头从cmdlet中检索编码.在此服务器的情况下,Content-Type在响应中被发回Content-Type: application/xml; charset="UTF-8".
这样做的问题是引号不是包含值的标准,charset因此cmdlet将其解析为"UTF-8"而不是有效UTF-8.cmdlet传递"UTF-8"给函数,函数抛出一个异常,指出提供的编码无效.这很好,并且如果这是最终例外中报告的内容会更有意义,但事实并非如此.
无效编码异常由Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault函数捕获,并在异常处理程序中GetEncoding再次调用,但使用null参数,这将导致final ArgumentNullException参数name.
Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault
internal static Encoding GetEncodingOrDefault(string characterSet)
{
string name = string.IsNullOrEmpty(characterSet) ? "ISO-8859-1" : characterSet;
try
{
return Encoding.GetEncoding(name);
}
catch (ArgumentException ex)
{
return Encoding.GetEncoding((string) null);
}
}
Run Code Online (Sandbox Code Playgroud)
GetEncoding对catch语句内部的调用会触发以下代码,GetCodePageFromName其中的代码本身也是从中调用的GetEncoding
if (name==null) {
throw new ArgumentNullException("name");
}
Run Code Online (Sandbox Code Playgroud)
PowerShell正在处理这个问题,因为从技术上讲它是一个无效的值,但你认为它们Trim("\"")只是为了安全起见.
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |