Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 为什么调用WebRequest和调用RestMethod同时失败和成功?_Powershell - Fatal编程技术网

Powershell 为什么调用WebRequest和调用RestMethod同时失败和成功?

Powershell 为什么调用WebRequest和调用RestMethod同时失败和成功?,powershell,Powershell,我编写了一个小的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

我编写了一个小的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
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);
  }
}
有人知道为什么
Invoke XXX
cmdlet返回错误,以及我可以做些什么来修复它吗?同样,当我使用
-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"

其中,
X-byte
是响应的实际大小,但根据发送到服务器的数据,每个响应的大小明显不同。我只是觉得很奇怪,cmdlet失败了,但它说它收到了一个带有数据的响应,并且它发送了一个
-1字节的
负载。

我继续查看
Invoke-WebRequest
cmdlet代码,并找出了它失败的原因

调用
System.Globalization.EncodingTable.GetCodePageFromName
失败。编码作为参数传递给该函数,并通过
内容类型
标题从cmdlet检索编码。对于该服务器,内容类型在响应中作为
Content-Type:application/xml发送回来;charset=“UTF-8”

这方面的问题是引号不是将值包装在
字符集中的标准值,因此cmdlet将其解析为
“UTF-8”
,而不是有效的
UTF-8
。cmdlet将
“UTF-8”
传递给该函数,该函数抛出一个异常,指出提供的编码无效。这很好,如果这是在最后一个例外中报告的,那么它会更有意义,但事实并非如此

Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault
函数捕获到无效编码异常,并在异常处理程序中再次调用
GetEncoding
,但使用空参数,这将导致参数
名称
的最终
ArgumentNullException

Microsoft.PowerShell.Commands.ContentHelper.GetEncodingOrDefault

$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
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);
  }
}
在catch语句中调用
GetEncoding
会触发
GetCodePageFromName
中的以下代码,该代码本身是从
GetEncoding
调用的

if (name==null) { 
    throw new ArgumentNullException("name");
}

PowerShell正确地处理了这个问题,因为从技术上讲,它是一个无效的值,但您可能认为它们会调用
Trim(“\”)
为了安全起见。

我在Python 2.7的
SimpleHTTPServer上遇到了这个问题。感谢您发现了根本原因。我在一个带有PowerShell(WMF)的完全修补的Windows Server 2012 R2机箱上看到了此清单5.1已安装。将相同的代码转移到Windows 10或Windows Server 2016,没有问题。非常令人失望,因为似乎没有解决方案。因此,4年后,您是否碰巧提出了解决此问题的解决方案?我遇到了完全相同的问题。现在是我的“解决方案”“看起来它必须迁移到Win2016服务器,在那里似乎没有出现此问题。不幸的是,没有。解决方案是使用错误代码修补程序集,使您请求的服务器返回调用WebRequest可以处理的值(如果您拥有服务器),或者就像你说的,换一个没有这个问题的不同版本的Windows。尽管,在您现在使用的任何版本的Windows上安装win2016版本的powershell可能值得一试,但我还没有测试过,因此您的里程可能会有所不同