Получите HTTP-запрос и допустите ошибку сервера 500 в powershell

В Powershell v3.0 я хотел бы вернуть код ответа из HTTP GET, например 200 OK или 500 Internal Server Error. (Это для взлома-развертывания, чтобы быстро развернуть развернутый сайт и посмотреть, работает ли он, своего рода мини-приемочный тест. Код состояния - это все, что я хочу.)

Против моих пожеланий HttpWebRequest.GetResponse выдает сообщение об ошибке, когда он получает 500 Internal Server Error. Это раздражает, потому что это не ошибка для меня в моем случае использования. Во всяком случае, я решил, что могу поймать исключение и все еще очистить базовый код ответа, но у меня проблемы с этим.

Вот несколько почти рабочий код:

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;
}

Проблема, конечно, в том, что $_ не имеет свойства Response. Также $_.InnerException, даже при нажатии:

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

Я играл с $_ | Get-Member и изучал все его свойства. Я думал, что у $_.TargetObject есть некоторые обещания, но это не похоже на.

(Обновить). Я также думаю, что я пробовал варианты на $_.Exception.Response, хотя, возможно, неправильно.

Получение просто кода ответа кажется таким простым делом.

Ответ 1

Вот пример, хотя он делает еще пару вещей, чтобы вы могли тестировать перенаправления, а также ожидаемые исключения.

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"