Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在PowerShell中获取数字HTTP状态代码_.net_Http_Powershell - Fatal编程技术网

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

.net 如何在PowerShell中获取数字HTTP状态代码,.net,http,powershell,.net,Http,Powershell,我知道有一种方法可以在PowerShell中构建web客户端:.NET类System.NET.WebClient和System.NET.HttpWebRequest,或者COM对象Msxml2.XMLHTTP。据我所知,唯一允许您访问数字状态代码(例如200404)的是最后一个COM对象。我的问题是,我不喜欢它的工作方式,也不喜欢依赖COM对象。我还知道,由于安全漏洞等原因,微软会不时决定杀死COM对象(ActiveX杀死位) 我还缺少另一个.NET方法吗?状态代码是否在这两个对象中的一个对象中

我知道有一种方法可以在PowerShell中构建web客户端:.NET类System.NET.WebClient和System.NET.HttpWebRequest,或者COM对象Msxml2.XMLHTTP。据我所知,唯一允许您访问数字状态代码(例如200404)的是最后一个COM对象。我的问题是,我不喜欢它的工作方式,也不喜欢依赖COM对象。我还知道,由于安全漏洞等原因,微软会不时决定杀死COM对象(ActiveX杀死位)


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

使用
[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

我意识到问题的标题是关于powershell的,但不是问题的真正含义?不管怎样

WebClient是HttpWebRequest的一个非常简单的包装器。如果您只是简单地使用服务或发布一点Xml,那么WebClient是非常好的,但折衷是它没有您希望的那么灵活。您将无法从WebClient获取所需的信息

如果需要状态代码,请从HttpWebResponse获取。如果您正在使用WebClient执行类似操作(仅将字符串发布到Url):

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

var response = 
    new WebClient().UploadData("http://webservice.com", "POST", bytes);
然后使用HttpWebRequest来获取状态代码。同样的想法,只是更多的选项(因此更多的代码)


使用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

它看起来很容易

$wc = New-Object NET.WebClient
$wc.DownloadString($url)
$wc.ResponseHeaders.Item("status")
您可以在ResponseHeaders属性中找到其他可用的响应头(如内容类型、内容长度、x-powered-by等),并通过Item()方法检索其中任何一个


。。。但是正如rob在下面提到的,遗憾的是,status属性在这里不可用

Aha,答案就在那里(我以前见过OK字符串),但我不知道!太好了,谢谢啊哈,resposne.statuscode是字符串,然后我使用x0n的枚举器技术将其转换为数字。谢谢:)P.S.如果我在标题中省略了PowerShell,那么我肯定我得到的答案会离我想要的更远。但我当然可以阅读您的代码。当它收到除2xx消息以外的任何消息时(我认为)会引发异常。在我的生活中,这不是预期的行为opinion@JoePhilllips我在代码段中添加了一个try..catch,以便它可以处理其他状态代码。@merv由于某些原因,您的编辑被其他人拒绝,但我继续对您的评论进行了投票,并手动进行了编辑。提交的thx请记住为
$req
设置一个
超时
,否则它是无限的,我会被抓住的!您还应该添加
$req.method=“HEAD”
,以便只下载标题,而不下载可能非常大的整个响应。这是每个人都想做的事情,但事实并非如此。向NET、WebClient发出请求后,响应标头中没有“状态”。更糟糕的是,如果不是200,则会引发异常,并且responseheaders属性为null。
$wc = New-Object NET.WebClient
$wc.DownloadString($url)
$wc.ResponseHeaders.Item("status")