WebClient 대 HttpClient 대 HttpWebRequest를 사용하는 경우

.NET Framework에서 작업 할 때 REST API를 사용하기위한 세 가지 선택 사항 인 WebClient, HttpClient 및 HttpWebRequest가 있습니다. 이 게시물에서는 관리 환경 내에서 즉 타사 라이브러리에 의존하지 않고 REST API에 액세스 할 수있는 세 가지 방법을 살펴 보겠습니다. 다음 섹션에서는 개념을 더 잘 이해할 수 있도록 관련 코드 예제와 함께 이러한 접근 방식을 설명합니다.

간단히 말해, WebRequest (HTTP 관련 구현 인 HttpWebRequest)는 .NET Framework에서 HTTP 요청을 사용하는 원래 방법을 나타냅니다. WebClient는 HttpWebRequest에 대해 간단하지만 제한된 래퍼를 제공합니다. HttpClient는 .NET Framework 4.5와 함께 제공되는 HTTP 요청 및 게시를 수행하는 새롭고 향상된 방법입니다.

WebRequest 추상 클래스로 토론을 시작하겠습니다.

System.Net.WebRequest

System.Net.WebRequest 클래스는 추상 클래스입니다. 따라서이 클래스를 사용하여 HTTP 요청을 사용하려면 HttpWebRequest 또는 FileWebRequest를 만들어야합니다. 다음 코드 스 니펫은 WebRequest로 작업하는 방법을 보여줍니다.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

WebRequest는 HTTP 요청을 사용하기 위해 .NET Framework에서 제공되는 첫 번째 클래스입니다. 사용자 인터페이스 스레드를 차단하지 않고 요청 및 응답 객체의 모든 측면을 처리하는 데 많은 유연성을 제공합니다. 이 클래스를 사용하여 HTTP로 작업 할 때 헤더, 쿠키, 프로토콜 및 시간 제한에 액세스하고 작업 할 수 있습니다. 다음 코드 조각은 HttpWebRequest를 사용하는 방법을 보여줍니다.

HttpWebRequest http = HttpWebRequest) WebRequest.Create (“// localhost : 8900 / api / default”);

WebResponse 응답 = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = 새로운 StreamReader (memoryStream);

문자열 데이터 = streamReader.ReadToEnd ();

여기에서 HttpWebRequest에 대한 Microsoft 문서를 찾을 수 있습니다. 

System.Net.WebClient

.NET의 System.Net.WebClient 클래스는 HttpWebRequest 위에 높은 수준의 추상화를 제공합니다. WebClient는 HttpWebRequest를 둘러싼 래퍼이므로 내부적으로 HttpWebRequest를 사용합니다. 따라서 WebClient는 HttpWebRequest에 비해 약간 느리지 만 훨씬 적은 코드를 작성해야합니다. WebClient를 사용하여 HTTP 서비스에 연결하고 작업하는 간단한 방법을 사용할 수 있습니다. HttpWebRequest가 제공하는 추가 기능을 활용해야하는 경우가 아니면 일반적으로 HttpWebRequest보다 더 나은 선택입니다. 다음 코드 스 니펫은 WebClient로 작업하는 방법을 보여줍니다.

문자열 데이터 = null;

(var webClient = new WebClient ()) 사용

{

    데이터 = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient는 .NET Framework 4.5에서 도입되었습니다. .NET 4.5 이상을 사용하는 개발자의 경우 사용하지 않을 특별한 이유가없는 한 HTTP 요청을 사용하는 것이 선호되는 방법입니다. 본질적으로 HttpClient는 HttpWebRequest의 유연성과 WebClient의 단순성을 결합하여 두 가지 장점을 모두 제공합니다.

HttpWebRequest 클래스는 요청 / 응답 개체에 대한 많은 제어를 제공합니다. 그러나 HttpClient는 WebClient를 대체하도록 설계되지 않았습니다. HttpWebRequest가 제공하는 추가 기능이 필요할 때마다 HttpClient 대신 HttpWebRequest를 사용해야합니다. 또한 WebClient와 달리 HttpClient는 진행률보고 및 사용자 지정 URI 체계를 지원하지 않습니다. 

HttpClient는 FTP를 지원하지 않지만 HttpClient를 모의하고 테스트하는 것이 더 쉽습니다. HttpClient의 모든 I / O 바인딩 된 메서드는 비동기 적이며 동일한 HttpClient 인스턴스를 사용하여 동시 요청을 만들 수도 있습니다. 다음 코드 조각은 HttpClient로 작업 할 수있는 방법을 보여줍니다.

공용 비동기 작업 GetAuthorsAsync (string uri)

{

    저자 저자 = null;

    HttpResponseMessage 응답 = client.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        작성자 = 응답 대기 .Content.ReadAsAsync ();

    }

    반환 저자;

}

응답에 오류가있을 때 HttpClient는 오류를 발생시키지 않습니다. 오히려 IsSuccessStatusCode속성을 false로 설정합니다 . IsSuccessStatusCode속성이 false 인 경우 예외를 throw하려면 EnsureSuccessStatusCode아래와 같이 응답 인스턴스 의 메서드를 호출 할 수 있습니다.

response.EnsureSuccessStatusCode ();

HttpClient는 한 번 인스턴스화되고 응용 프로그램의 수명주기 동안 재사용되도록 설계되었습니다. 응용 프로그램에서 처리해야하는 모든 요청에 ​​대해 새 HttpClient 인스턴스를 만들면 안됩니다. 그렇게하면 사용 가능한 소켓이 과도한 트래픽으로 인해 고갈되어  SocketException오류가 발생할 수 있습니다. 권장되는 방법은 단일 공유 HttpClient 인스턴스를 만드는 것입니다.