web-dev-qa-db-fra.com

Pourquoi HttpWebRequest lève-t-il une exception à la place en retournant HttpStatusCode.NotFound?

J'essaie de vérifier l'existence d'une URL à l'aide de HttpWebRequest. J'ai trouvé quelques exemples qui font essentiellement ceci:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.Method = "HEAD";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    return response.StatusCode;
}

Cependant, si l'URL est en effet cassée, elle ne renvoie pas de réponse, elle lève plutôt une exception.

J'ai modifié mon code en ceci:

try
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
    request.Method = "HEAD";
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        return response.StatusCode;
    }
}
catch (System.Net.WebException ex)
{
    var response = ex.Response as HttpWebResponse;
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode;
}

qui semble enfin faire ce que je veux.

Mais je voudrais savoir pourquoi la demande lève une exception au lieu de renvoyer la réponse avec un code d'état NotFound?

37
SelAromDotNet

Oui, cela peut être assez ennuyeux lorsque les pages Web utilisent fortement les codes d'état et que ce ne sont pas toutes des erreurs. Ce qui peut rendre le traitement du corps assez pénible. Personnellement, j'utilise cette méthode d'extension pour obtenir la réponse.

public static class HttpWebResponseExt
{
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req)
    {
        try
        {
            return (HttpWebResponse)req.GetResponse();
        }
        catch (WebException we)
        {
            var resp = we.Response as HttpWebResponse;
            if (resp == null)
                throw;
            return resp;
        }
    }
}
62
Will

Pourquoi pas? Ce sont deux options de conception valides, et HttpWebRequest a été conçu pour fonctionner de cette façon.

2
Mahmoud Al-Qudsi