2012-03-03 3 views
2

System.Net.HttpWebRequestを使用してリモートホストと通信するPowershellスクリプトがあります。System.Net.HttpWebRequest :: GetResponse()のエラー処理

私はリクエストを作成し、それに応じてプロパティを設定し、getresponse()getresponsestream()を呼び出して、サーバーからの応答全体を文字列に読み込みます。これは、サーバーが "200 OK"メッセージで応答する限り正常に動作します。

サーバーが「400 Bad Request」などのエラーコードで応答する場合、getresponse()getresponsestream()は例外をスローし、何も返しません。私の問題は、私が自分自身でエラー処理をするために必要なレスポンスヘッダに、より詳細なエラー情報が含まれていることです。

この400 Bad Request信号はどのように取得できますか?

+0

すでに例外オブジェクトをキャッチし、$ _。Exception.Messageプロパティを見たことがありますか?そして$ _。Exceptionオブジェクトを調べましたか? –

答えて

5

編集:私が最初に質問を誤解し、それはあなたがHttpWebResponse.GetResponseHeader()メソッドを使用して、レスポンスヘッダを取得できることが判明しました。例外が発生した場合は、HttpWebRequest.GetResponse()方法は$nullを返し、あなたはそれにGetResponseHeader()を呼び出すことができるように、HttpWebResponseのオブジェクトを取得するには、このコードを使用する必要があります。

# If an exception occurs, get the HttpWebResponse object from the WebException object 
$HttpWebResponse = $Error[0].Exception.InnerException.Response; 

私は「あなたかなり確信していますSystem.Net.WebClientオブジェクトの代わりにSystem.Net.HttpWebRequestを使用します。ここでは、おそらく既に持っているものと同様の例です:

# Create a HttpWebRequest using the Create() static method 
$HttpWebRequest = [System.Net.HttpWebRequest]::Create("http://www.google.com/"); 

# Get an HttpWebResponse object 
$HttpWebResponse = $HttpWebRequest.GetResponse(); 

# Get the integer value of the HttpStatusCode enumeration 
Write-Host -Object $HttpWebResponse.StatusCode.value__; 

のGetResponse()メソッドは、HttpStatusCode .NET列挙型の値を指すStatusCodeという名前のプロパティがありHttpWebResponseオブジェクトを返します。列挙型への参照を取得したら、value__プロパティを使用して、返された列挙型の値に関連付けられている整数を取得します。

GetResponse()メソッドからヌル値を取得した場合は、catch {..}ブロックで最新のエラーメッセージを参照したいと思うでしょう。 Exception.ErrorRecordプロパティが最も役立ちます。

try { 
    $HttpWebResponse = $null; 
    $HttpWebRequest = [System.Net.HttpWebRequest]::Create("http://www.asdf.com/asdf"); 
    $HttpWebResponse = $HttpWebRequest.GetResponse(); 
    if ($HttpWebResponse) { 
    Write-Host -Object $HttpWebResponse.StatusCode.value__; 
    Write-Host -Object $HttpWebResponse.GetResponseHeader("X-Detailed-Error"); 
    } 
} 
catch { 
    $ErrorMessage = $Error[0].Exception.ErrorRecord.Exception.Message; 
    $Matched = ($ErrorMessage -match '[0-9]{3}') 
    if ($Matched) { 
    Write-Host -Object ('HTTP status code was {0} ({1})' -f $HttpStatusCode, $matches.0); 
    } 
    else { 
    Write-Host -Object $ErrorMessage; 
    } 

    $HttpWebResponse = $Error[0].Exception.InnerException.Response; 
    $HttpWebResponse.GetResponseHeader("X-Detailed-Error"); 
} 

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx

http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx

+0

3桁のHTTPステータスコードは何もしません。リモートホストのレスポンスからカスタムヘッダー" X-Detailed-Error "にアクセスする必要があります。getresponse()を呼び出してWebレスポンスを返す方法はありませんかどのような状態コードであろうと、オブジェクトですか? – Justin

+0

この例を更新しました。例外が発生した場合、 'HttpWebResponse'オブジェクトを取得する必要があります:' $ Error [0] .Exception.InnerException.Response' 'GetResponseHeader(" X-Detailed-Error ");'メソッドを呼び出すことができます –

+0

これは素晴らしい動作です、ありがとう! – Justin

0

tryとcatchステートメントを試したことがありますか?これは私のためにうまく動作します。

例:

$webclient = new-object system.net.webclient 
try { 
    $domain = $webclient.downloadstring("http://xrsolis.com") # get a non existent domain 
} catch { 
    write-host "domain inaccessible" 
} 
+0

サーバーからの完全な応答にアクセスできないため、実際には役に立ちません。サーバーが共通のHTTPステータスコードを送信した後も、要求が処理されなかった正確な理由でカスタムヘッダー(X詳細エラー)が送信されます。私はそのヘッダーにアクセスできる必要があります。 $ _。例外は、コンソールでcatch文なしで表示されるのと同じ例外メッセージを返します。 "0"引数を指定して "GetResponse"を呼び出す例外: "リモートサーバーからエラーが返されました:(403)禁止されています。") – Justin