我知道在PowerShell中构建Web客户端的few good ways:.NET类System.Net.WebClient和System.Net.HttpWebRequest,或COM对象Msxml2.XMLHTTP。据我所知,唯一一个允许您访问数字状态代码(例如200,404)的是最后一个COM对象。我遇到的问题是我不喜欢它的工作方式,我不喜欢依赖COM对象。我也知道,由于安全漏洞等原因,微软将不时决定杀死COM对象(ActiveX kill bits)。
我还缺少另一种.NET方法吗?状态代码是否是其他两个对象中的一个,我只是不知道如何获取它?
答案 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提到的那样,遗憾的是,状态属性在这里不可用