Czy istnieje łatwy sposób uzyskania kodu stanu HTTP z pliku System.Net.WebException
?
c#
http-status-codes
webexception
Gilsham
źródło
źródło
Używając operatora warunkowego zerowego (
?.
), możesz uzyskać kod stanu HTTP za pomocą jednej linii kodu:Zmienna
status
będzie zawieraćHttpStatusCode
. Gdy wystąpi bardziej ogólna awaria, taka jak błąd sieciowy, w którym nie jest wysyłany żaden kod statusu HTTP, wówczasstatus
będzie miał wartość NULL. W takim przypadku można sprawdzićex.Status
, aby uzyskaćWebExceptionStatus
.Jeśli chcesz, aby opisowy ciąg był rejestrowany w przypadku niepowodzenia, możesz użyć operatora łączenia wartości null (
??
), aby uzyskać odpowiedni błąd:Jeśli wyjątek zostanie zgłoszony w wyniku kodu stanu HTTP 404, ciąg znaków będzie zawierał „NotFound”. Z drugiej strony, jeśli serwer jest offline, ciąg będzie zawierał „ConnectFailure” i tak dalej.
źródło
?.
operator został pierwotnie nazwany operatorem propagacji wartości null, czy operatorem warunkowym o wartości null podczas wersji zapoznawczej. Jednak Atlassian resharper ostrzega przed użyciem operatora propagacji wartości null w takich scenariuszach. Dobrze wiedzieć, że jest również nazywany operatorem warunkowym zerowym.działa to tylko wtedy, gdy WebResponse jest HttpWebResponse.
źródło
(Zdaję sobie sprawę, że pytanie jest stare, ale jest jednym z najpopularniejszych w Google).
Typowa sytuacja, w której chcesz poznać kod odpowiedzi, dotyczy obsługi wyjątków. Począwszy od C # 7, możesz użyć dopasowania do wzorca, aby faktycznie wprowadzić klauzulę catch tylko wtedy, gdy wyjątek pasuje do twojego predykatu:
Można to łatwo rozszerzyć na dalsze poziomy, na przykład w tym przypadku, gdy
WebException
faktycznie był wewnętrznym wyjątkiem innego (i tylko nas interesuje404
):Na koniec: zwróć uwagę, że nie ma potrzeby ponownego zgłaszania wyjątku w klauzuli catch, gdy nie pasuje on do twoich kryteriów, ponieważ nie wprowadzamy klauzuli na pierwszym miejscu w powyższym rozwiązaniu.
źródło
Możesz wypróbować ten kod, aby uzyskać kod stanu HTTP z WebException. Działa również w Silverlight, ponieważ SL nie ma zdefiniowanego WebExceptionStatus.ProtocolError.
źródło
return 0
? lub lepiejHttpStatusCode?
( null )?var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Nie jestem pewien, czy istnieje, ale gdyby istniała taka nieruchomość, nie zostałaby uznana za wiarygodną.
WebException
Może być zwolniony z przyczyn innych niż HTTP Kody błędów w tym prostych błędów sieciowych. Te nie mają takiego pasującego kodu błędu http.Czy możesz nam podać więcej informacji na temat tego, co próbujesz osiągnąć za pomocą tego kodu. Może istnieć lepszy sposób na uzyskanie potrzebnych informacji.
źródło