Обработка ошибок в System.Net.HttpWebRequest :: GetResponse () - PullRequest
2 голосов
/ 03 марта 2012

У меня есть скрипт Powershell, который использует System.Net.HttpWebRequest для связи с удаленным хостом.

Я создаю запрос, соответственно задаю свойства и вызываю getresponse() и getresponsestream(), чтобы прочитать весь ответ сервера в строку. Это работает нормально, пока сервер отвечает сообщением «200 OK».

Если сервер отвечает «400 Bad Request» или любым другим кодом ошибки, getresponse() и getresponsestream() генерируют исключения и ничего не возвращают. Моя проблема в том, что в заголовок ответа включена более подробная информация об ошибках, которая мне нужна, чтобы я мог выполнять свою собственную обработку ошибок.

Как бы я смог получить этот сигнал 400 Bad Request?

Ответы [ 2 ]

5 голосов
/ 03 марта 2012

Редактировать : Сначала я неправильно понял вопрос, но оказалось, что вы можете получить заголовок ответа, используя метод HttpWebResponse.GetResponseHeader().Если возникает исключение, метод HttpWebRequest.GetResponse() возвращает $null, и вы должны использовать этот код для извлечения объекта HttpWebResponse, чтобы вы могли вызвать GetResponseHeader() для него:

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

Я уверен, что вы захотите придерживаться System.Net.HttpWebRequest вместо System.Net.WebClient объекта.Вот пример, похожий на то, что вы, вероятно, уже имеете:

# 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 () возвращает объект HttpWebResponse, который имеет свойство с именем StatusCode, которое указывает на значение вHttpStatusCode .NET перечисление.Как только вы получите ссылку на перечисление, мы используем свойство 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 голосов
/ 03 марта 2012

Когда-нибудь пробовали операторы try и catch?Это прекрасно работает для меня.

ex:

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