2009-09-24 16 views
16

Web istemcileri PowerShell'de oluşturmak için bir few good ways biliyorum: .NET sınıfları System.Net.WebClient ve System.Net.HttpWebRequest veya COM nesnesi Msxml2.XMLHTTP. Anlayabildiğim kadarıyla, sayısal durum koduna (örneğin 200, 404) erişmenizi sağlayan tek şey, son COM nesnesidir. Sahip olduğum problem, çalışma şeklini beğenmediğim ve orada bulunan COM nesnesine güvenmeyi sevmemem. Ayrıca zaman zaman Microsoft'un güvenlik açıkları ve benzerleri nedeniyle COM nesnelerini (ActiveX kill bitlerini) öldürmeye karar vereceğini de biliyorum.PowerShell'de sayısal HTTP durum kodları nasıl elde edilir

Eksik olduğum başka bir .NET yöntemi var mı? Durum kodu, diğer iki nesneden birinde mi ve ona nasıl ulaşacağımı bilmiyorum?

cevap

47

, bunu çok kötü formu değil umut:

$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

Bu, bir 2xx iletisinin (sanırım) bir şey aldığında bir istisna atar. Bu benim düşüncemde beklenen bir davranış değil –

+1

@JoePhilllips Denemeye başladım ..snippet'i yakalayın, böylece diğer durum kodlarını işleyebilir. – merv

+0

Bir sebepten ötürü düzenleme işleminiz bir başkası tarafından reddedildi, ancak ben ileri gittim ve yorumunuzu kestim ve düzenlemeyi elle yaptım. Gönderme için tx – halr9000

11

Belirtilen tür [system.net.httpstatuscode] kullanın.

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

[int] olarak döküm, sayısal kodunu almak için:

-Oisin

+0

Aha burada mevcut değil! Mükemmel teşekkürler. :) – halr9000

4

Ben Sorunun başlık powershell hakkındadır fark bu yardımcı olur

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

Umut, ancak soru ne sormuyor? Her iki şekilde de ...

WebClient, HttpWebRequest için çok aşağılık bir sarıcıdır. WebClient, sadece çok basit bir hizmet tüketimini veya biraz Xml yayınlamanız durumunda harikadır, ancak bu, sizin istediğiniz gibi esnek olmamasına bağlıdır. WebClient'ten aradığınız bilgileri alamayacaksınız.

Durum koduna ihtiyacınız varsa, bunu HttpWebResponse'den edinin. Eğer/WebClient'a w (sadece bir URL için bir dize gönderme) böyle bir şey yaptığını olsaydı:

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

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

o zaman durum kodu almak için HttpWebRequest ile bunu istiyorum. Aynı fikir, sadece daha fazla seçenek (ve bu nedenle daha fazla kod). Bir kod örneği ile tam daire gelmek hem x0n ve joshua ibrik verdiği cevapları kullanarak

//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; 
+0

Aha, resposne.statuscode dizedir ve sonra bir sayıya dönüştürmek için x0n numaralandırma tekniğini kullanırım. teşekkürler :) – halr9000

+0

P.S. Eğer PowerShell'i başlığında bırakmış olsaydım, geri döndüğüm cevap istediğimden daha da uzak olurdu. ama kesinlikle kodunuzu okuyabilirim. – halr9000

1

O çok kolay görünüyor

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

Diğer kullanılabilir Yanıt Üstbilgileri, ResponseHeaders özelliğinde (içerik türü, içerik uzunluğu, x-powered-by ve benzeri) bulunabilir ve bunlardan herhangi birini alabilirsiniz. Item() yöntemi ile.

... ama soymak aşağıda bahseder gibi ne yazık ki, durum özelliği, cevap (daha önce Tamam dize gördüğü) vardı, ama bunu bilmiyordum

+1

Herkesin çalışmak istediği şey bu, ama değil. NET, WebClient ile bir istekte bulunduktan sonra yanıt başlıklarında "durum" yoktur. Daha da kötüsü, 200 değilse, istisna atılır ve responseheaders özelliği boştur. – rob

İlgili konular