Pourquoi HttpWebRequest renvoie-t-il une exception au lieu de renvoyer 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 effectivement cassée, elle ne renvoie pas de réponse, mais génère une exception.

J’ai modifié mon code pour 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 j’aimerais savoir pourquoi la requête génère une exception au lieu de renvoyer la réponse avec un code d’état NotFound.

Ya cela peut être assez ennuyeux lorsque les pages Web utilisent des codes d’état fortement et ne sont pas tous 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; } } } 

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