Controleren of HttpStatusCode staat voor succes of mislukking

Stel dat ik de volgende variabele heb:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

Hoe kan ik controleren of dit een successtatuscode of een foutstatuscode is?

Ik kan bijvoorbeeld het volgende doen:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

Ik kan ook een soort witte lijst hebben:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}

Geen van deze alternatieven overtuigt me, en ik hoopte op een .NET-klasse of -methode die dit werk voor mij kan doen, zoals:

bool isSuccess = HttpUtilities.IsSuccess(status);

Antwoord 1, autoriteit 100%

Als je de klasse HttpClientgebruikt, krijg je een HttpResponseMessageterug.

Deze klasse heeft een handige eigenschap genaamd IsSuccessStatusCodedie de controle voor je zal doen.

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}

In het geval u nieuwsgierig bent, deze eigenschap is geïmplementeerdals:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

Je kunt dit algoritme dus gewoon opnieuw gebruiken als je nietrechtstreeks HttpClientgebruikt.

Je kunt ook EnsureSuccessStatusCodegebruiken om een ​​uitzondering te genereren voor het geval het antwoord niet succesvol was.


Antwoord 2, autoriteit 8%

Het geaccepteerde antwoord stoort me een beetje omdat het magische getallen bevat (hoewel ze standaard zijn) in het tweede deel. En het eerste deel is niet generiek voor gewone gehele statuscodes, hoewel het in de buurt komt van mijn antwoord.

U kunt exact hetzelfde resultaat bereiken door HttpResponseMessage te instantiëren met uw statuscode en te controleren op succes. Er wordt wel een argumentuitzondering gegenereerd als de waarde kleiner is dan nul of groter dan 999.

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

Dit is niet bepaald beknopt, maar je zou er een extensie van kunnen maken.


Antwoord 3, autoriteit 6%

De klasse HttpResponseMessage heeft een eigenschap IsSuccessStatusCode, kijkend naar de broncode ziet het er zo uit, zoals usr al heeft gesuggereerd dat 200-299 waarschijnlijk het beste is dat u kunt doen.

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

Antwoord 4, autoriteit 5%

Toevoegen aan @TomDoesCode-antwoord Als u HttpWebResponse gebruikt
je kunt deze extensiemethode toevoegen:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}

Other episodes