웹 클라이언트와 HttpWebRequest / HttpWebResponse


132

성취 할 수있는 대부분은 수업으로 HttpWebRequest/Response도 달성 할 수있는 것 같습니다 WebClient. 에 WebClient대한 고급 래퍼 인 어딘가를 읽었습니다 WebRequest/Response.
지금까지로 수행 HttpWebRequest/Response할 수없는 WebClientHttpWebRequest / Response가 더 세밀한 제어를 제공하는 곳 을 볼 수 없습니다 .

언제 WebClient를 사용해야 HttpWebRequest/Response합니까? (분명히 HttpWebRequest/ResponseHTTP에 따라 다릅니다.)

그렇다면 HttpWebRequest/Response저수준이라면 WebClient무엇을 달성 HttpWebRequest/Response할 수 WebClient없는가?

답변:


87

를 사용 HttpWebRequest하면 요청을보다 세밀하게 제어 할 수 있습니다. 쿠키, 헤더, 프로토콜 등을 설정할 수 있습니다. 응답으로 쿠키 및 헤더를 검색 할 수도 있습니다.


14
Thomas, 여전히 확신하지 못합니다 ... WebClient에 Headers 속성이 있습니다. 쿠키를 다음과 같이 검색 할 수 있습니다. String cookie = webClient.ResponseHeaders (“Set-Cookie”) 및 설정 : webClient.Headers.Add ( "Cookie", " CommunityServer-UserCookie… ");
Dan

14
HttpWebRequest를 사용하면 시간 초과를 정의 할 수 있습니다. WebClient에서는 불가능합니다.
ripper234

14
@ ripper234, 실제로는 것입니다 수 : 방금 상속 웹 클라이언트를 가지고 있고 HttpWebRequest를 사용자 정의 할 수 GetWebRequest를 오버라이드 (override)
토마스 레베

15
@ThomasLevesque 만약 당신이 웹 클라이언트를 상속하고 웹 요청을 무시한다면, 그것은 웹 클라이언트를 사용하는 것은 무의미한 것 같습니다 ...
Hagai L

5
@HagaiL, 동의하지 않습니다 ... 전체 요청을 수동으로 만들 필요는 없습니다. 요청을 base.GetWebRequest만든 다음 원하는대로 사용자 지정할 수 있습니다.
Thomas Levesque

54

HttpWebRequest Keep-Alive 사용 여부, 사용할 연결 풀, 쓰기 버퍼링 여부 등과 같은 세밀한 프로토콜 제어를 가능하게하는 훨씬 더 많은 항목을 노출합니다.

WebClientWebClient기본 Request 객체 에서 서브 클래스로 액세스 할 수 있지만 모든 것을 공개하지는 않습니다 .

WebClient(: POST / GET / 양식 업로드 등)과 생성하고 관리 할 수 방해하지 못할 방금 작업을 수행 할 이러한 상황에 유용합니다 HttpWebRequest, RequestStream, HttpWebResponse, 및 응답 스트림을.


13
또한 언급하지 않은 것이 하나 더 있습니다. WebClient는 Component 객체이지만 HttpWebRequest는 아닙니다. 그게 무슨 뜻이야? 글쎄, VisualStudio를 사용하여 GUI 응용 프로그램을 작성하는 경우 양식에서 WebClient 구성 요소를 끌어다 놓아 HTTP / FTP 등 서버에 요청을 발행하는 데 사용할 수 있습니다.
feroze 2009

14

Tim Heuer의 블로그에서-http: //timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

대신 Silverlight에서는 WebClient 또는 HttpWebRequest를 사용하려고합니다. 차이점이 뭐야? 다음은 timheuer 버전입니다. WebClient는 GET 요청을 쉽게 수행하고 응답 스트림을 얻는 간단한 구현입니다. HttpWebRequest는 요청을 조금 더 세밀하게 제어하고 헤더 또는 기타 사용자 정의를 보내야 할 때 유용합니다.


7
웹 클라이언트는 UploadString, UploadData 및 UploadFile로와 POST, 수
토마스 레베

@ThomasLevesque 오늘 수업의 최신 버전이 있습니까? 나는이 논의가 조금 흠 ... 세 ... 것을 볼
콘라드 Viltersten

@KonradViltersten, WebClient 클래스에 많은 변화가 있다고 생각하지 않습니다. 새로운 앱의 경우 HttpClient를 대신 사용하는 것이 좋습니다. 사용하기 쉽고 훨씬 유연합니다.
Thomas Levesque

1
@ThomasLevesque 오른쪽, 내가 생각했던 일이었다. 클래스 이름의 차이로 http 를 리콜 하고 Http ... 부분으로 오도했습니다 . 이제 올바른 길로 돌아 왔습니다. 감사!
Konrad Viltersten

12

웹 클라이언트의 데이터가 인터넷에서 다운로드되는 동안 사용자 인터페이스 스레드에서 수업 실행, 그래서 사용자 인터페이스가 응답하지 않습니다. 반면에 HttpWebRequest 클래스는 사용자 인터페이스 스레드를 차단하지 않으며 응용 프로그램이 응답합니다. 따라서 인터넷에서 대량의 데이터를 다운로드하거나 데이터 소스의 액세스 속도가 느린 앱에서는 HttpWebRequest 클래스를 사용해야합니다. 다른 모든 경우에는 WebClient 클래스를 사용해야합니다.


1
WP7에서는 그 반대입니다. HttpWebRequest는 망고의 UI 스레드로 다시 마샬링되어 슬픔을 끝내지 않습니다. Grrr
Cameron MacFarland

6
WebClient는 비동기 메소드도 지원합니다.
CyberMonk

6

의 또 다른 단점은 WebClient그것이 HTTP 무시하다 ContentTypecharset당신이 응답 텍스트를 얻기 위해 그것을 사용할 때 값입니다. Encoding속성을 통해 인코딩을 명시 적으로 설정해야 합니다.


이것은 좋은 지적입니다. 그리고 그것은 설정의 문제가 Encoding아닙니다 . 요청이 끝날 때까지 인코딩을 수 없으므로 WebClient API를 사용하면 알 수없는 인코딩으로 문자열을 올바르게 다운로드 할 수 없을 것입니다.
Eamon Nerbonne


5

"HtttpWebRequest"는 .NET 4.5에서 사용되지 않습니다. 이제이 클래스는 내부 전용입니다.


2
과연. WebRequest대신 사용하십시오 .
silkfire

2
클래스는 더 이상 사용되지 않으며 생성자는 있습니다. 그리고 수업은 내부가 아니며 여전히 공개적입니다.
user247702

2

한 가지 예 : 한 요청 / 응답주기에서 데이터를 게시하고 처리 된 데이터를 다시 가져 오는 것은 WebClient에서는 불가능한 것으로 보이지만 HtttpWebRequest를 사용하여이를 수행 할 수 있습니다.


2
WebClient.UploadString 또는 WebClient.UploadData를 사용하여 POST를 수행하고 응답 문자열 또는 바이트 배열을 다시 가져 오십시오.
samjudson

2
명확히하기 위해 UploadString의 반환 값은 문자열이고 UploadData 메서드의 반환 값은 바이트 배열입니다.
Norman H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.