„System.Net.WebException“ HTTP būsenos kodas

Ar yra paprastas būdas gauti HTTP būsenos kodą iš System.Net.WebException ?

108
01 сент. Gilshamas nustatytas rugsėjo 1 d 2010-09-01 02:49 '10, 2:49 val. 2010-09-01 02:49
@ 6 atsakymai

Gal kažkas panašaus ...

 try { // ... } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { var response = ex.Response as HttpWebResponse; if (response != null) { Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode); } else { // no http status code available } } else { // no http status code available } } 
171
01 сент. atsakymą pateikė LukeH 01 sep . 2010-09-01 03:04 '10, 3:04, 2010-09-01 03:04

Naudojant „ null“ sąlyginį ( ?. ) Operatorių, galite gauti HTTP būsenos kodą su viena kodo eilute:

  HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode; 

status kintamasis bus HttpStatusCode . Kai įvyksta bendresnis gedimas, pvz., Tinklo klaida, kai HTTP būsenos kodas nesiunčiamas, status bus nulinė. Tokiu atveju galite patikrinti ex.Status kad gautumėte „ WebExceptionStatus .

Jei tiesiog norite, kad aprašomoji eilutė būtų užregistruota gedimo atveju, galite naudoti nulinio sutelkimo ( ?? ) Operatorių, kad gautumėte atitinkamą klaidą:

border=0
 string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString() ?? ex.Status.ToString(); 

Jei dėl 404 HTTP būsenos kodo pasirinkta išimtis, eilutėje bus „NotFound“. Kita vertus, jei serveris yra išjungtas, eilutėje bus „ConnectFailure“ ir tt

(Ir tiems, kurie nori žinoti, kaip gauti HTTP pakaitalo kodą. Tai neįmanoma. Tai „Microsoft IIS“ koncepcija, kuri yra registruota tik serveryje ir niekada nesiunčiama klientui.)

12
17 янв. Martin Liversage atsakymas, sausio 17 d 2017-01-17 16:31 '17, 16:31 pm 2017-01-17 16:31

Tai veikia tik tada, jei „WebResponse“ yra „HttpWebResponse“.

 try { ... } catch (System.Net.WebException exc) { var webResponse = exc.Response as System.Net.HttpWebResponse; if (webResponse != null  webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized) { MessageBox.Show("401"); } else throw; } 
8
16 янв. atsakymas pateikiamas pr0gg3r 16 sausis 2014-01-16 13:26 '14, 13:26 pm 2014-01-16 13:26

Nesu tikras, kad yra, bet jei toks turtas būtų, jis nebūtų laikomas patikimu. WebException gali būti suaktyvinta dėl priežasčių, išskyrus HTTP klaidų kodus, įskaitant paprastas tinklo klaidas. Jie neturi tinkamo http klaidos kodo.

Ar galite pateikti mums šiek tiek daugiau informacijos apie tai, ką bandote atlikti su šiuo kodu. Galbūt geriausias būdas gauti reikalingą informaciją.

1
01 сент. Atsakymas duotas JaredPar 01 Sep. 2010-09-01 02:56 '10, 2:56 val. 2010-09-01 02:56

Galite pabandyti šį kodą gauti HTTP būsenos kodą iš „WebException“. Jis taip pat veikia „Silverlight“, nes SL neturi „WebExceptionStatus.ProtocolError“ apibrėžimo.

 HttpStatusCode GetHttpStatusCode(WebException we) { if (we.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse)we.Response; return response.StatusCode; } return 0; } 
1
09 дек. atsakymas pateikiamas Sergejui 09 d. 2014-12-09 13:05 '14, 13:05 2014-12-09 13:05

(Suprantu, kad klausimas yra senas, tačiau jis yra vienas iš geriausių „Google“ pasiekimų.)

Bendra situacija, kai norite sužinoti atsakymo kodą, yra išimties tvarkymas. Pradedant nuo C # 7, galite naudoti modelio atitikimą, kad iš tikrųjų įveskite sugavimo sąlygą tik tada, kai išimtis atitinka jūsų predikatą:

 catch (WebException ex) when (ex.Response is HttpWebResponse response) { doSomething(response.StatusCode) } 

Tai gali būti lengvai išplėsta į papildomus lygius, pavyzdžiui, šiuo atveju, kai „ WebException iš tiesų yra kitos vidinės išimtis (ir mes suinteresuoti tik 404 ):

 catch (StorageException ex) when (ex.InnerException is WebException wex  wex.Response is HttpWebResponse r  r.StatusCode == HttpStatusCode.NotFound) 

Galiausiai: atkreipkite dėmesį, kad nereikia persvarstyti išimties sugavimo sąlygoje, jei ji neatitinka jūsų kriterijų, nes pirmiau minėtą sprendimą nepriimame.

1
18 окт. atsakymas duotas miniyou 18 spalis 2017-10-18 15:55 '17 15:55 2017-10-18 15:55

Kiti klausimai apie žymes arba Ask a Question