2

少数のサーバーで複数のページを監視する powershell スクリプトがあります。サーバーの正常性を判断するために、それぞれから HTTP ステータス コードが提供されます。

これは何週間も完全に機能していましたが、今日、スクリプトに変更を加えていないため、タイムアウト エラー (「操作がタイムアウトしました」) が発生し始めました。サーバーへのポート 80 の telnet はすぐに通過し、考えられる他のすべてのメカニズムを介して問題なく接続できました。

最後に、タイムアウト期間を 1000 ミリ秒から 2000 ミリ秒に変更してスクリプトを更新すると、スクリプトはすぐに再び機能しました。そして、1000msに戻した後も機能しました。

同じ解像度でこのようなことが起こったのはこれが 2 回目です。何が起きていて、どうすればそれを回避できますか?

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 などに関連しているようです。.NET の代わりに COM を使用するようにコードを変更したところ、正常に動作するようになりました。

......

$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 に答える