Supposons que j'ai la variable suivante:
System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
Comment puis-je vérifier s'il s'agit d'un code d'état de réussite ou d'échec?
Par exemple, je peux faire ce qui suit:
int code = (int)status;
if(code >= 200 && code < 300) {
//Success
}
Je peux aussi avoir une sorte de liste blanche:
HttpStatusCode[] successStatus = new HttpStatusCode[] {
HttpStatusCode.OK,
HttpStatusCode.Created,
HttpStatusCode.Accepted,
HttpStatusCode.NonAuthoritativeInformation,
HttpStatusCode.NoContent,
HttpStatusCode.ResetContent,
HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
//Success
}
Aucune de ces alternatives ne me convainc, et j'espérais une classe ou une méthode .NET capable de faire ce travail pour moi, telle que:
bool isSuccess = HttpUtilities.IsSuccess(status);
c#
.net
system.net
Matias Cicero
la source
la source
int code = (int)Response.StatusCode
partir de là, vous devrez créer votre propreEnum
chèque ici pour un exemple de travail stackoverflow.com/questions/1330856/…HttpClient
classe?HttpResponseMessage
par exempleHttpResponseMessage.IsSuccessStatusCode
(voir ma réponse) qui est exactement la même que votre première approche, et en faire une méthode d'extension sur leHttpStatusCode
type.Réponses:
Si vous utilisez la
HttpClient
classe, vous obtiendrez unHttpResponseMessage
remboursement.Cette classe a une propriété utile appelée
IsSuccessStatusCode
qui effectuera la vérification pour vous.Au cas où vous êtes curieux, cette propriété est implémentée comme:
Vous pouvez donc simplement réutiliser cet algorithme si vous ne l' utilisez pas
HttpClient
directement.Vous pouvez également utiliser
EnsureSuccessStatusCode
pour lever une exception au cas où la réponse échouerait.la source
La classe HttpResponseMessage a une propriété IsSuccessStatusCode, en regardant le code source, c'est comme ça, comme usr l'a déjà suggéré, 200-299 est probablement le mieux que vous puissiez faire.
la source
La réponse acceptée me dérange un peu car elle contient des nombres magiques, (bien qu'ils soient en standard) dans sa deuxième partie. Et la première partie n'est pas générique pour les codes d'état entiers simples, bien qu'elle soit proche de ma réponse.
Vous pouvez obtenir exactement le même résultat en instanciant HttpResponseMessage avec votre code d'état et en vérifiant le succès. Il lève une exception d'argument si la valeur est inférieure à zéro ou supérieure à 999.
Ce n'est pas exactement concis, mais vous pouvez en faire une extension.
la source
IsSuccessStatusCode
alors super, utilisez-le (comme le dit la réponse acceptée.) Sinon, n'ajoutez pas votre propre cruft en utilisant une abstraction à moins que vous n'effectuiez cette vérification partoutHttpResponseMessage
pour utiliser l'une de ses propriétés prend plus de temps que la vérification de deux conditions logiques avecint
.Ajout à la réponse @TomDoesCode Si vous utilisez HttpWebResponse, vous pouvez ajouter cette méthode d'extension:
la source
Je suis partisan de la découvrabilité des méthodes d'extension.
Tant que votre espace de noms est dans la portée, l'utilisation serait
statusCode.IsSuccessStatusCode()
.la source
HttpStatusCode
champ d'application? Il existe de nombreuses bibliothèques qui n'utilisent pas ou ne font pas surface,HttpResponseMessage
mais qui vous donnent le code d'état.Cela dépend de la ressource HTTP que vous appelez. Habituellement, le
2xx
plage est définie comme la plage de codes d'état de réussite. C'est clairement une convention à laquelle tous les serveurs HTTP n'adhéreront pas.Par exemple, la soumission d'un formulaire sur un site Web renverra souvent une redirection 302.
Si vous souhaitez concevoir une méthode générale, l'
code >= 200 && code < 300
idée est probablement la meilleure solution.Si vous appelez votre propre serveur, vous devriez probablement vous assurer que vous standardisez sur
200
.la source
Il s'agit d'une extension de la réponse précédente, qui évite la création et le garbage collection ultérieur d'un nouvel objet pour chaque appel.
la source