如何在PowerShell中获取数字HTTP状态代码

时间:2009-09-24 18:26:39

标签: .net http powershell

我知道在PowerShell中构建Web客户端的few good ways:.NET类System.Net.WebClient和System.Net.HttpWebRequest,或COM对象Msxml2.XMLHTTP。据我所知,唯一一个允许您访问数字状态代码(例如200,404)的是最后一个COM对象。我遇到的问题是我不喜欢它的工作方式,我不喜欢依赖COM对象。我也知道,由于安全漏洞等原因,微软将不时决定杀死COM对象(ActiveX kill bits)。

我还缺少另一种.NET方法吗?状态代码是否是其他两个对象中的一个,我只是不知道如何获取它?

4 个答案:

答案 0 :(得分:53)

使用x0n和joshua ewer的答案来完整的代码示例,我希望这不是太糟糕的形式:

$url = 'http://google.com'
$req = [system.Net.WebRequest]::Create($url)

try {
    $res = $req.GetResponse()
} 
catch [System.Net.WebException] {
    $res = $_.Exception.Response
}

$res.StatusCode
#OK

[int]$res.StatusCode
#200

答案 1 :(得分:13)

使用[system.net.httpstatuscode]枚举类型。

ps> [enum]::getnames([system.net.httpstatuscode])
Continue
SwitchingProtocols
OK
Created
Accepted
NonAuthoritativeInformation
NoContent
ResetContent
...

要获取数字代码,请转换为[int]:

ps> [int][system.net.httpstatuscode]::ok
200

希望这有帮助,

-Oisin

答案 2 :(得分:4)

我意识到这个问题的标题是关于powershell的,但不是真正的问题是什么?无论哪种方式......

WebClient是HttpWebRequest的一个非常愚蠢的包装器。如果您只是非常简单地使用服务或发布一些Xml,WebClient就很棒,但权衡的是它并不像您希望的那样灵活。您将无法从WebClient获取您要查找的信息。

如果您需要状态代码,请从HttpWebResponse获取。如果您正在做这样的事情(只是将字符串发布到Url)w / WebClient:

var bytes = 
    System.Text.Encoding.ASCII.GetBytes("my xml"); 

var response = 
    new WebClient().UploadData("http://webservice.com", "POST", bytes);

然后你用HttpWebRequest做这个来获取状态代码。同样的想法,只是更多的选择(因此更多的代码)。

//create a stream from whatever you want to post here
var bytes = 
  System.Text.Encoding.ASCII.GetBytes("my xml"); 
var request = 
  (HttpWebRequest)WebRequest.Create("http://webservice.com");

//set up your request options here (method, mime-type, length)

//write something to the request stream
var requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);        
requestStream.Close();

var response = (HttpWebResponse)request.GetResponse();

//returns back the HttpStatusCode enumeration
var httpStatusCode = response.StatusCode;

答案 3 :(得分:1)

外观非常容易

$wc = New-Object NET.WebClient
$wc.DownloadString($url)
$wc.ResponseHeaders.Item("status")

您可以在ResponseHeaders属性中找到其他可用的响应标头(如content-type,content-length,x-powered-by等),并通过Item()方法检索其中的任何响应标头。

...但正如下面的rob提到的那样,遗憾的是,状态属性在这里不可用