2

我有一个 powershell 脚本,可以监视少数服务器上的多个页面。它提供来自每个的 HTTP 状态代码,以确定服务器的健康状况。

这已经完美运行了几个星期,但是今天,在没有对脚本进行任何更改的情况下,我开始收到超时错误(“操作已超时”)。服务器的 80 端口上的 telnet 让我立即通过,我可以通过我能想到的所有其他机制愉快地连接。

最后,我通过将超时时间从 1000 毫秒更改为 2000 毫秒来更新脚本,并且脚本立即再次运行。在我将它改回 1000 毫秒后它仍然有效。

这是第二次以相同的分辨率发生类似的事情。发生了什么,我该如何避免?

4

2 回答 2

0

此脚本可能会有所帮助,对于您的情况可能有点过分。

function HTTP-Get() {
    param
    (
        [string] $target
    )

    try
    {
        $webRequest = [System.Net.WebRequest]::Create($target)
        $webRequest.Method = "GET"

        [System.Net.WebResponse] $resp = $webRequest.GetResponse();
        $rs = $resp.GetResponseStream();

        [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
        [string] $results = $sr.ReadToEnd();
    }

    catch [System.Net.WebException] 
    {
        Write-Warning $_
        if ($_.response)
        {
            $_.response.Close();    
        }
    }

    finally
    {
        if ($sr)
        {
            $sr.close();
            $sr.dispose();
        }
        if ($resp)
        {
            $resp.close();
        }
    }

    return $results;
}
于 2012-06-12T08:19:41.137 回答
0

正如我在评论中提到的:我在 powershell 上遇到了这个问题,并且没有任何 .NET http 技巧起作用(httprequest、webclient)。我使用的网站与邮递员和其他 http 助手一起工作得很好。

似乎问题与 .NET 版本、sp 等有关。我将代码更改为使用 COM 而不是 .NET,现在它工作正常。

......

$HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
$Http = new-object -com "WinHttp.WinHttpRequest.5.1"
$Http.open("GET", "http://....", $false)

$Http.SetCredentials($userName, $password, $HttpREQUEST_SETCREDENTIALS_FOR_SERVER) 

$Http.send()
$status = [int]$Http.Status
$responseText = $Http.responseText

.....

我希望它有帮助:)

于 2015-10-29T16:00:01.063 回答