[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리

728x90
반응형

 

우연치 않은 기회가 되어, 각 프로젝트에서 사용하는 HTTP를 호출하는 상황에 대해서 여러 코드를 보게 되었습니다.

몇개의 프로젝트 및 툴들을 조사하다 보니 정말 다양한 방법으로 HTTP를 요청하고 있었는데요.

기회가 된 김에 정리를 한번 해보려고 합니다. 정리를 하다 보니 더 다양하게 알게 되는거 같아서 좋았습니다. 

.NET Framework에서 사용하는 방식에 대해서만 정리를 했습니다. 

 

.NET Framework에서 작업할 때 HTTP 요청을 사용하기 위해서는 세가지 방법이 있습니다. 

WebRequest (HttpWebRequest)

WebClient 

HttpClient

위 class들을 어떻게 사용하는 것이 좋은가? 세가지 class가 다 필요한 것인가? 에대한 질문을 스스로 던져보았는데요.

결론은, 각각 존재해야 하는 이유가 있었습니다. 물론 MSDN를 보게되면 HttpClient를 권장하는 것 같지만

몇가지 이유에 의해서 각각의 Class 들은 존재 해야 합니다.

 


 

System.Net.WebRequest

System.Net.WebRequest 는 추상 클래스 입니다. 따라서 이 클래스를 사용하여 HTTP  요청을 사용하려면 HttpWebRequest 또는 FileWebRequest 를 사용해서 작성해야 한다고 합니다. 

이 클래스를 이용해서 작업시, Header, Cookie, Protocol 및 시간초과에 액세스 하고 작업할 수 있는 장점이 있으며,

HTTP 요청에 대한 세밀한 컨트롤이 가능한 장점이 있습니다. 

가장 많이 접한 class 또한 HttpWebRequest class 였습니다.

 


 

System.Net.WebClient

WebClient는 HttpWebRequst의 Wrapper 이므로, 내부적으로는 HttpWebRequest를 사용합니다. 

따라서 WebClient는 HttpWebRequest에 비해 약간 느리지만, 적은량의 소스 코드만으로도 동작 할 수 있습니다.

HttpWebRequest가 제공하는 추가 기능을 활용할 필요가 없다면 WebClient를 사용하는 것이 나은 선택입니다. 

 

하지만 이 외에 WebClient는 HttpClient에서 지원하지 못하는, 다운로드를 위한 진행 상황을 제공합니다.

또한, WebRequest와 마찬가지로 FTP를 지원합니다.

 

 

이 두 부분이 HttpClient 와 WebClient의 사용성을 구분짓는 것 같습니다.

 

 


 

System.Net.Http.HttpClient

HttpClient 는 .NET Framework 4.5에서 도입되었습니다.

HttpClient는 HttpWebRequest의 유연성과  WebClient의 단순성을 결합하여 제공하기 때문에, 해당 프레임워크를 사용하는 환경이라면, HttpClient 를 사용하는 것을 권장하고 있습니다. 

 

HttpWebRequest는 요청/응답 객체에 대한 많은 제어 기능을 제공하기 때문에, 이러한 기능이 필요하다면 HttpClient 보다는 HttpWebRequest를 사용해야 합니다만, HttpClient는 FTP를 지원하지 않습니다. 

 

HttpClient의 모든 I/O 바인딩 메소드는 비동기식이며, 동일한 HttpClient 인스턴스를 사용해서 동시 요청을 수행할 수 있습니다. 즉, 동기 비동기식을 모두 제공합니다.

 

HttpClient는 한 번 인스턴스화되고 응용프로그램의 수명주기 전체에서 재사용 하도록 설계되었습니다.

만약 반복적으로 HttpClient를 사용한다면, 매번 할당 후 제거하는 방식이 아닌 한번 사용한 객체를 재사용하도록 설계하여야 합니다. new 키워드로 HttpClient를 생성 할 때마다 사용 가능한 소켓이 많은 트래픽으로 소진되기 때문에 SocketException이 발생 할 수 있습니다. 

그러므로 HttpClient의 권장 사용 방법은 단일 공유 HttpClient 인스턴스를 작성 하는 것 입니다. 

 

 


개인적인 정리

1. .NET Framework 4.5 를 이용하는 환경이라면 HttpClient 를 사용하는 것을 권장합니다.

2. 단. HttpClient를 사용한다면, 단일화된 HttpClient 인스턴스를 생성하고 재사용 하는 것이 좋습니다. (static)

3. HttpClient는 WebClient를 완전히 대체하지 못하기 때문에, 필요에 따라 WebClient를 사용해야 합니다.

 

4. .NET Framework 4.5 버전을 사용 못하는 환경이라면, HttpWebRequest 와 WebClient의 장점을 비교해서 사용하시면 됩니다. 

5. 요청 및 응답에 따른 다양한 제어 및 헤더, 쿠키등등 HTTP의 구성요소를 사용해야 한다면 HttpWebRequest 를 이용하는 것이 좋습니다.

 

 


추가 사항

MSDN을 들어가 보면, 위와 같이 새로운 개발환경이라면, WebClient, HttpWebRequest 를 추천하지 않으며, 

System.Net.Http.HttpClient Class를 사용하라고 안내문구가 나오고 있습니다.

필요에 따라서 HttpWebRequest는 사용해도 괜찮을거 같지만 이렇게 문구가 적혀있다보니 HttpClient로 넘어가는 작업을 해봐야겠습니다. 

하지만, HttpClient는 WebClient가 지원하는 일부 기능을 지원하지 않으니...

정말 필요에 따라 선택해서 사용해야겠습니다.

 

 


 

 

참고

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html
https://stackoverflow.com/questions/20530152/deciding-between-httpclient-and-webclient/27737601#27737601

 

728x90