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