2012-04-10 3 views
31

HttpWebRequest를 사용하여 URL의 존재를 확인하려고합니다. URL이 참으로 깨진 경우, 그것은 응답을 반환하지 않는 것HttpWebRequest가 HttpStatusCode.NotFound를 반환하는 대신 예외를 throw하는 이유는 무엇입니까?

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

, 대신 예외를 던지고 : 나는 몇 기본적으로이 할 사례를 발견했다. 마지막으로 내가 원하는 것을 할 것 같다

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; 
} 

:

나는이 내 코드를 수정했습니다.

하지만 NotFound 상태 코드를 사용하여 응답을 반환하는 대신 요청이 예외를 던지는 이유는 무엇입니까?

답변

54

예 웹 페이지가 상태 코드를 많이 사용하며 모두 오류가 아니라는 것은 매우 성가 시울 수 있습니다. 몸을 가공하는 것은 꽤 고통 스럽습니다. 개인적으로 나는이 확장 메소드를 사용하여 응답을받습니다.

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; 
     } 
    } 
} 
+6

.Net Framework 작성자의 부분에서 잘못된 디자인을 선택하여 HttpWebRequest/Response를 사용하여 코드를 저장하는 작업이 가장 적지 만 올바른 해결 방법은 4xx 및 5xx 상태 코드를 throw하지 않는 HttpClient를 사용하는 것입니다. 예외는 예외적 인 상황을위한 것이고 그것을 잡으려고 던지면서 퍼포먼스에 좋지 않은 것처럼 진행됩니다. 특히 퍼펙트를 완전히 피하는 더 좋은 옵션이있는 경우에는 예외입니다. https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

이 사실이 아닌 것으로 보입니다. 프로젝트에서 HttpClient를 사용 중이고 404 상태 코드를 반환하는 존재하지 않는 url을 호출 할 때 클라이언트는 404 상태 코드와 함께 응답을 반환하는 대신 예외를 throw합니다. 이것을 막기 위해 httpclient를 사용하는 추가 단계가 있습니까? – SelAromDotNet

2

왜 안 되니? 두 가지 모두 유효한 디자인 옵션이며 HttpWebRequest는 이러한 방식으로 작동하도록 설계되었습니다.

+0

는 긴 코드가 4XX –

+4

때 응답 헤더와 본문을 읽을 수있는 나는이 보았다 코드 샘플 중 어느 것도 고려이했다 없기 때문에 나는 혼란 된 것 같아요. 많은 사람들은 try/catch도하지 않았고, 아마도 내가 뭔가를 놓친다면 예외를 던지지 않고 상태를 얻는 방법이 있는지 궁금해하고있었습니다. 상태 코드가 이러한 상태를 처리하도록 설계된 경우 전체적인 예외를 throw하는 것이 직관에 어긋나는 것 같습니다. – SelAromDotNet

+1

그래, "물론 xxx가 자신의 웹 사이트에 삽입 한 코드 줄을 테스트했다고 생각하면 항상 재미있는 결과가 나타납니다!" 실수로 밝혀졌습니다. –

관련 문제