2017-01-30 8 views
2

Я убил 3 часа сегодня и не понимаю почему?Мистика: Invoke-WebRequest работает только через ISE

У меня есть простой скрипт:

$user = 'icm' 
$pass = 'icm' 
$pair = "$($user):$($pass)" 
$url = 'http://####:15672/api/queues/%2f/ICM.Payments.Host.1' 
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair)) 
$basicAuthValue = "Basic $encodedCreds" 
$headers = @{ 
    Authorization = $basicAuthValue 
} 
$request = Invoke-WebRequest -Uri $url -Headers $headers -ContentType "application/json" 
$messages = ($request.Content | ConvertFrom-Json | Select -ExpandProperty messages) 
$messages 

Таким образом, с помощью PS ISE он отлично работает, но через powershell.exe я вижу ошибку ниже.

Invoke-WebRequest : {"error":"Object Not Found","reason":"\"Not Found\"\n"} 
At C:\Temp\Untitled1.ps1:16 char:12 
+ $request = Invoke-WebRequest -Uri $url -Headers $headers -ContentType ... 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException 
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand 
ConvertFrom-Json : Cannot bind argument to parameter 'InputObject' because it is null. 
At C:\Temp\Untitled1.ps1:17 char:33 
+ $messages = ($request.Content | ConvertFrom-Json | Select -ExpandProp ... 
+         ~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [ConvertFrom-Json], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertFromJsonCommand 

Доказательство attached.

ответ

0

У меня была такая же проблема с RabbitMQ, причиной является экранирование %2f в URL. См Percent-encoded slash (“/”) is decoded before the request dispatch

С уловок выше ответа, он работает как в ISE и консоли:

$urlFixSrc = @" 
using System; 
using System.Reflection; 

public static class URLFix 
{ 
    public static void ForceCanonicalPathAndQuery(Uri uri) 
    { 
     string paq = uri.PathAndQuery; 
     FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); 
     ulong flags = (ulong) flagsFieldInfo.GetValue(uri); 
     flags &= ~((ulong) 0x30); 
     flagsFieldInfo.SetValue(uri, flags); 
    } 
} 
"@ 
Add-Type -TypeDefinition $urlFixSrc -Language CSharp 

$url = [URI]$url 

Invoke-WebRequest -Uri $url -Headers $headers -ContentType "application/json"