Załóżmy, że mam następującą zmienną:
System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
Jak mogę sprawdzić, czy jest to kod statusu sukcesu, czy błąd?
Na przykład mogę wykonać następujące czynności:
int code = (int)status;
if(code >= 200 && code < 300) {
//Success
}
Mogę też mieć jakąś białą listę:
HttpStatusCode[] successStatus = new HttpStatusCode[] {
HttpStatusCode.OK,
HttpStatusCode.Created,
HttpStatusCode.Accepted,
HttpStatusCode.NonAuthoritativeInformation,
HttpStatusCode.NoContent,
HttpStatusCode.ResetContent,
HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
//Success
}
Żadna z tych alternatyw mnie nie przekonuje i liczyłem na klasę lub metodę .NET, która może wykonać tę pracę za mnie, na przykład:
bool isSuccess = HttpUtilities.IsSuccess(status);
c#
.net
system.net
Matias Cicero
źródło
źródło
int code = (int)Response.StatusCode
stamtąd będziesz musiał utworzyć swój własnyEnum
czek tutaj dla przykładu roboczego stackoverflow.com/questions/1330856/ ...HttpClient
klasy?HttpResponseMessage
na przykład wewnętrznegoHttpResponseMessage.IsSuccessStatusCode
(zobacz moją odpowiedź), która jest dokładnie taka sama jak w przypadku pierwszego podejścia, i uczynić ją metodą rozszerzającą dlaHttpStatusCode
typu.Odpowiedzi:
Jeśli korzystasz z
HttpClient
klasy, otrzymaszHttpResponseMessage
zwrot.Ta klasa ma użyteczną właściwość o nazwie,
IsSuccessStatusCode
która wykona sprawdzenie za Ciebie.using (var client = new HttpClient()) { var response = await client.PostAsync(uri, content); if (response.IsSuccessStatusCode) { //... } }
Jeśli jesteś ciekawy, ta właściwość jest zaimplementowana jako:
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
Możesz więc po prostu ponownie użyć tego algorytmu, jeśli nie używasz go
HttpClient
bezpośrednio.Możesz również użyć,
EnsureSuccessStatusCode
aby zgłosić wyjątek w przypadku, gdy odpowiedź nie powiodła się.źródło
Klasa HttpResponseMessage ma właściwość IsSuccessStatusCode, patrząc na kod źródłowy wygląda to tak, ponieważ usr zasugerował już, że 200-299 to prawdopodobnie najlepsze, co możesz zrobić.
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
źródło
Przyjęta odpowiedź trochę mnie niepokoi, bo w drugiej części zawiera magiczne liczby (choć są w standardzie). Pierwsza część nie jest ogólna dla kodów stanu w postaci liczb całkowitych, chociaż jest bliska mojej odpowiedzi.
Możesz osiągnąć dokładnie ten sam wynik, tworząc wystąpienie HttpResponseMessage z kodem statusu i sprawdzając, czy powodzenie. Rzuca wyjątek argumentu, jeśli wartość jest mniejsza od zera lub większa niż 999.
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode) { // ... }
Nie jest to do końca zwięzłe, ale możesz zrobić z tego rozszerzenie.
źródło
IsSuccessStatusCode
to świetne, użyj go (zgodnie z akceptowaną odpowiedzią). W przeciwnym razie nie dodawaj własnego cruft za pomocą abstrakcji, chyba że wykonujesz to sprawdzanie wszędzieHttpResponseMessage
celu użycia jednej z jego właściwości zajmuje więcej czasu niż sprawdzenie dwóch warunków logicznych za pomocąint
.Dodawanie do odpowiedzi @TomDoesCode Jeśli używasz HttpWebResponse, możesz dodać tę metodę rozszerzenia:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse) { return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299); }
źródło
Jestem zwolennikiem wykrywalności metod rozszerzających.
public static class HttpStatusCodeExtensions { public static bool IsSuccessStatusCode(this HttpStatusCode statusCode) { var asInt = (int)statusCode; return asInt >= 200 && asInt <= 299; } }
Dopóki przestrzeń nazw znajduje się w zakresie, użycie będzie
statusCode.IsSuccessStatusCode()
.źródło
HttpStatusCode
zakres? Istnieje wiele bibliotek, które nie używają aniHttpResponseMessage
nie wyświetlają się, ale podają kod statusu.Zależy to od wywoływanego zasobu HTTP. Zwykle
2xx
zakres jest definiowany jako zakres kodów statusu sukcesu. Jest to oczywiście konwencja, której nie będzie przestrzegać każdy serwer HTTP.Na przykład przesłanie formularza w witrynie internetowej często zwraca przekierowanie 302.
Jeśli chcesz opracować ogólną metodę,
code >= 200 && code < 300
pomysł jest prawdopodobnie najlepszym rozwiązaniem.Jeśli dzwonisz na swój własny serwer, prawdopodobnie powinieneś upewnić się, że używasz standardu
200
.źródło
Jest to rozszerzenie poprzedniej odpowiedzi, które pozwala uniknąć tworzenia i późniejszego czyszczenia nowego obiektu dla każdego wywołania.
public static class StatusCodeExtensions { private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>(); public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode); }
źródło