Nehmen wir an, ich habe die folgende Variable:
System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
Wie kann ich überprüfen, ob dies ein Erfolgsstatuscode oder ein Fehlercode ist?
Zum Beispiel kann ich Folgendes tun:
int code = (int)status;
if(code >= 200 && code < 300) {
//Success
}
Ich kann auch eine Art weiße Liste haben:
HttpStatusCode[] successStatus = new HttpStatusCode[] {
HttpStatusCode.OK,
HttpStatusCode.Created,
HttpStatusCode.Accepted,
HttpStatusCode.NonAuthoritativeInformation,
HttpStatusCode.NoContent,
HttpStatusCode.ResetContent,
HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
//Success
}
Keine dieser Alternativen überzeugt mich und ich hatte auf eine .NET-Klasse oder -Methode gehofft, die diese Arbeit für mich erledigen kann, wie zum Beispiel:
bool isSuccess = HttpUtilities.IsSuccess(status);
c#
.net
system.net
Matias Cicero
quelle
quelle
int code = (int)Response.StatusCode
von dort aus müssen Sie Ihre eigene erstellenEnum
Check hier für das Arbeitsbeispiel stackoverflow.com/questions/1330856/...HttpClient
Klasse?HttpResponseMessage
zum BeispielHttpResponseMessage.IsSuccessStatusCode
(siehe meine Antwort), die genau Ihrem ersten Ansatz entspricht, jederzeit wiederverwenden und sie zu einer Erweiterungsmethode für denHttpStatusCode
Typ machen.Antworten:
Wenn Sie die
HttpClient
Klasse verwenden, erhalten Sie eineHttpResponseMessage
Rückerstattung.Diese Klasse hat eine nützliche Eigenschaft namens
IsSuccessStatusCode
, die die Prüfung für Sie durchführt.Falls Sie neugierig sind, wird diese Eigenschaft wie folgt implementiert :
So können Sie einfach diesen Algorithmus wiederverwenden , wenn Sie nicht mit
HttpClient
direkt.Sie können auch
EnsureSuccessStatusCode
eine Ausnahme auslösen, falls die Antwort nicht erfolgreich war.quelle
Die HttpResponseMessage-Klasse verfügt über eine IsSuccessStatusCode-Eigenschaft. Wenn Sie den Quellcode so betrachten, ist dies wahrscheinlich das Beste, was Sie tun können, da usr bereits vorgeschlagen hat, 200-299 zu verwenden.
quelle
Die akzeptierte Antwort stört mich ein wenig, da sie im zweiten Teil magische Zahlen enthält (obwohl sie im Standard sind). Und der erste Teil ist nicht generisch für einfache ganzzahlige Statuscodes, obwohl er meiner Antwort nahe kommt.
Sie können genau das gleiche Ergebnis erzielen, indem Sie HttpResponseMessage mit Ihrem Statuscode instanziieren und auf Erfolg prüfen. Es wird eine Argumentausnahme ausgelöst, wenn der Wert kleiner als Null oder größer als 999 ist.
Dies ist nicht gerade prägnant, aber Sie könnten es zu einer Erweiterung machen.
quelle
IsSuccessStatusCode
dann großartig sind, verwenden Sie es (wie in der akzeptierten Antwort angegeben). Andernfalls fügen Sie Ihre eigene Cruft nicht mithilfe einer Abstraktion hinzu, es sei denn, Sie führen diese Prüfung überall durchHttpResponseMessage
der Verwendung einer seiner Eigenschaften mehr Zeit in Anspruch nimmt als das Überprüfen von zwei logischen Bedingungen mitint
.Hinzufügen zur @ TomDoesCode-Antwort Wenn Sie HttpWebResponse verwenden, können Sie diese Erweiterungsmethode hinzufügen:
quelle
Ich bin an der Auffindbarkeit von Erweiterungsmethoden interessiert.
Solange sich Ihr Namespace im Gültigkeitsbereich befindet, wird verwendet
statusCode.IsSuccessStatusCode()
.quelle
HttpStatusCode
Umfang haben? Es gibt viele Bibliotheken, die nicht verwenden oder auftauchen,HttpResponseMessage
aber Ihnen den Statuscode geben.Dies hängt davon ab, welche HTTP-Ressource Sie aufrufen. Normalerweise wird der
2xx
Bereich als Bereich der Erfolgsstatuscodes definiert. Dies ist eindeutig eine Konvention, die nicht jeder HTTP-Server einhalten wird.Wenn Sie beispielsweise ein Formular auf einer Website senden, wird häufig eine 302-Weiterleitung zurückgegeben.
Wenn Sie eine allgemeine Methode entwickeln möchten, ist die
code >= 200 && code < 300
Idee wahrscheinlich die beste.Wenn Sie Ihren eigenen Server anrufen, sollten Sie wahrscheinlich sicherstellen, dass Sie standardisieren
200
.quelle
Dies ist eine Erweiterung der vorherigen Antwort, die die Erstellung und anschließende Speicherbereinigung eines neuen Objekts für jeden Aufruf vermeidet.
quelle