System.Net.HttpWebRequest :: GetResponse()中的错误处理

时间:2012-03-03 05:41:27

标签: .net powershell httpwebrequest httpwebresponse

我有一个Powershell脚本,它使用System.Net.HttpWebRequest与远程主机通信。

我创建请求,相应地设置属性并调用getresponse()getresponsestream()来读取服务器到字符串的整个响应。只要服务器以“200 OK”消息响应,这就可以正常工作。

如果服务器响应“400 Bad Request”或任何其他错误代码,getresponse()getresponsestream()会抛出异常并且不返回任何内容。我的问题是我需要的响应头中包含更详细的错误信息,因此我可以自己进行错误处理。

我如何能够检索此400 Bad Request信号?

2 个答案:

答案 0 :(得分:5)

编辑:我最初误解了这个问题,但事实证明您可以使用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

答案 1 :(得分: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"
}