2014-03-27 5 views
10

In Powershell v3.0 möchte ich den Antwortcode von einem HTTP-GET wie 200 OK oder 500 Internal Server Error zurückgeben. (Dies ist für eine Hack-Bereitstellung, um eine schnelle Aufwärmung einer bereitgestellten Website zu tun und zu sehen, ob es funktioniert, eine Art Mini-Abnahmetest. Der Statuscode ist wirklich alles, was ich will.)HTTP-Anfrage erhalten und 500 Serverfehler in Powershell tolerieren

Gegen meine Wünsche, HttpWebRequest.GetResponse gibt einen Fehler aus, wenn es eine 500 Internal Server Error empfängt. Das ist ärgerlich, weil es für mich in meinem Anwendungsfall nicht wirklich ein Fehler ist. Wie auch immer, ich dachte, ich könnte die Ausnahme abfangen und trotzdem den zugrunde liegenden Antwortcode herausziehen, aber ich habe Probleme damit.

Hier einige fast arbeit Code:

function WebResponseStatusCode (
    [Parameter(Mandatory=$true)][string] $url 
) { 
    $req = [system.Net.HttpWebRequest]::Create($url) 
    try { 
     $res = $req.GetResponse(); 
     $statuscode = $res.statuscode; 
    } 
    catch [System.Net.WebException] { 
     #the outer error is a System.Management.Automation.ErrorRecord 
     Write-Host "error!" 
     return = $_.Response.statuscode; #nope 
    } 
    finally { 
     if (!($res -eq $null)) { 
      $res.Close(); 
     } 
    } 
    return $statuscode; 
} 

Das Problem ist natürlich, dass $_ keine Response Eigenschaft hat. Genauso wenig wie $_.InnerException, auch wenn sie gegossen:

return [System.Net.WebException]($_.InnerException) 

ich um mit $_ | Get-Member und erkunden all seinen Eigenschaften gespielt habe. Ich dachte, hatte etwas Versprechen, aber es scheint nicht zu.

(Update) Ich glaube auch, ich habe versucht, Variationen auf $_.Exception.Response, obwohl es falsch verstanden haben kann.

Es ist so einfach, einen Antwortcode zu erhalten.

+0

Ich habe gesehen, andere Leute in dieses Problem geraten. Es sollte wahrscheinlich als eine Verbesserungsanfrage auf http://connect.microsoft.com protokolliert werden, um nicht auf 5xx Statuscodes zu werfen. –

+0

Sehen Sie die gleichen Ergebnisse mit Invoke-WebRequest? Ich habe keinen Server, der ein 500-Ergebnis liefert, um zu testen. – Arluin

+0

Das Seltsame ist, dass 'Invoke-WebRequest' diese Fehler anders behandelt als zum Beispiel' Test-Connection' (d. H. Ping). 'Test-Connection' verwendet' -ErrorVariable' und '-ErrorAction' wie erwartet. 'Invoke-WebRequest' ruft nur' Write-Error' auf, wenn etwas schief geht. –

Antwort

15

Hier ist ein Beispiel, obwohl es noch ein paar Dinge gibt, mit denen Sie Umleitungen sowie erwartete Ausnahmen testen können.

function GetWebSiteStatusCode { 
    param (
     [string] $testUri, 
     $maximumRedirection = 5 
    ) 
    $request = $null 
    try { 
     $request = Invoke-WebRequest -Uri $testUri -MaximumRedirection $maximumRedirection -ErrorAction SilentlyContinue 
    } 
    catch [System.Net.WebException] { 
     $request = $_.Exception.Response 

    } 
    catch { 
     Write-Error $_.Exception 
     return $null 
    } 
    $request.StatusCode 
} 

GetWebSiteStatusCode -testUri "https://www.google.com/" 
GetWebSiteStatusCode -testUri "https://www.google.com/foobar" 
GetWebSiteStatusCode -testUri "http://google.com/" -maximumRedirection 0 
GetWebSiteStatusCode -testUri "https://accounts.google.com" -maximumRedirection 0 
GetWebSiteStatusCode -testUri "https://www.googleapis.com/coordinate/v1/teams/1/custom_fields?fields=1111&key=" 
GetWebSiteStatusCode -testUri "https://www.googleapis.com/shopping/search/v1/test/products/sasdf/asdf/asdf?key=" 

#Next test would be for an expected 500 page. 
#GetWebSiteStatusCode -testUri "https://www.somesite.com/someurlthatreturns500" 
+0

Das ist großartig. Ich wusste, dass es einen Weg geben musste, es einfacher zu machen. Es ist schade, dass Sie immer noch eine Ausnahme machen müssen, aber es funktioniert zumindest! Ich weiß nicht, warum meine Versuche, '$ _. Exception.Response' zu ​​verwenden, nicht funktioniert haben. – ErikE

+0

Beachten Sie, dass die Ausnahme eine 'System.Net.HttpWebResponse' zurückgibt, nicht ein' Microsoft.PowerShell.Commands.HtmlWebResponseObject'. In meinen Tests scheint der Antwortstream bereits gelesen worden zu sein. – hangar

+0

Ich habe das versucht und es scheint für die meisten Fehlercodes zu funktionieren. Jedoch, wenn ich einen 12029 (System kann nicht die Ressource angegebenen) Code erhalten, dies gibt mir eine 0 ... Bitte geben Sie –

Verwandte Themen