HttpClient는 동시에 사용하는 것이 안전합니까?


151

의 사용법을 찾을 수있는 모든 예제 HttpClient에서 한 번의 오프 콜에 사용됩니다. 그러나 여러 클라이언트가 동시에 요청할 수있는 지속적인 클라이언트 상황이 발생하면 어떻게해야합니까? 기본적으로 client.PostAsync같은 인스턴스에 대해 두 개의 스레드를 한 번에 호출 하는 것이 안전합니다 HttpClient.

나는 실제로 실험 결과를 찾고 있지 않습니다. 실제 예제는 단순히 fluke (그리고 그에 대한 지속적인 것) 일 수 있으며, 실패한 예제는 잘못된 구성 문제 일 수 있습니다. 이상적으로는 HttpClient의 동시성 처리 문제에 대한 권위있는 답변을 찾고 있습니다.


2
또한 올바르게 사용 HttpClient하고 폐기 하는 방법에 대한 자세한 내용은이 질문을 읽으 십시오. stackoverflow.com/questions/15705092/…
Mani Gandham

답변:


152

MSDN에 따르면 .NET 4.5부터 다음 인스턴스 메소드 는 스레드 안전합니다 (@ischell 덕분에).

CancelPendingRequests
DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync

3
네, MSDN의 모든 것에 대한 표준 경고 인 것처럼 보입니다. (그리고 모든 것에 맹목적으로 적용되므로 경고가 언제 잘못되었는지에 대한 MSDN 블로그를 읽는 것을 기억합니다).
Alex K

3
이것은 잘못이다. 링크 된 MSDN 페이지의 비고 섹션에서 GetAsync, PostAsync 등은 모두 스레드로부터 안전하다고 말합니다.
ischell

4
@ischell : 문제가 논의 될 당시 해당 단락 이 없었 음을 확신 할 수 있습니다 .
Marcel N.

7
따라서 Microsoft는 HttpClient를 재사용 할 수 있도록 설계했지만 클래스에는 헤더에 대한 인스턴스 데이터가 있습니다. client.DefaultRequestHeaders.Accept.Add (...);
cwills

8
늦었지만 @cwills에 대해 언급하고 싶었습니다. DefaultRequestHeaders는 기본값입니다. 요청별로 다른 헤더를 원하면 새 StringContent ()를 만들고 추가 헤더를 설정 한 다음 URI 및 HttpContent를 사용하는 오버로드를 사용할 수 있습니다.
Ryan Anderson

92

다음은 Henrik F. Nielsen의 HttpClient에 대한 다른 기사 입니다.

" 기본 HttpClient는 가장 간단한 방법으로 요청 전송을 시작할 수 있습니다 . 단일 HttpClient를 사용하여 원하는만큼 많은 HTTP 요청을 보낼 수 있으므로 많은 시나리오에서 하나의 HttpClient를 만든 다음 모든 요청에 ​​사용할 수 있습니다. . "


13
스레드간에 사용자 이름과 비밀번호를 변경할 수 있다면 어떨까요? 그것이 내가 말하는 사람을 찾을 수없는 것입니다
Nicholas DiPiazza

1
@NicholasDiPiazza : 얼마나 자주 변경됩니까? 알려진 사용자 / 암호 쌍이있는 경우 HttpClient 인스턴스 풀을 만들 수 있습니다.
Marcel N.

그래 그게 내가
끝났어

2
모든 요청에 ​​동일한 HttpClient를 재사용하면 부실한 DNS 문제가 발생할 수 있습니다 ( github.com/dotnet/corefx/issues/11224) .
하드 슈나이더

1
@OhadSchneider이 문제가 .net 코어로 제한되어 있다고 생각되면. HttpClient 생성자에 사용자 지정 HttpClientHandler를 삽입 한 다음 "ConnectionLeaseTimeout"을 설정하여 .net 4의 문제를 해결할 수 있습니다. 그러나 100 초 동안 요청이 엔드 포인트로 전송되지 않으면 연결이 자체적으로 새로 고쳐집니다. 보호 된 재정의 Task <HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancelToken) {var sp = ServicePointManager.FindServicePoint (request.RequestUri); sp.ConnectionLeaseTimeout = 100 * 1000; }
Timothy Gonzalez

17

MSDN 포럼 게시물을 찾았 습니다.Henrik F. Nielsen (HttpClient의 주요 아키텍트 을 .

빠른 요약 :

  • 관련이 있거나 서로 밟지 않는 요청이 있으면 동일한 HttpClient를 사용하는 것이 좋습니다.
  • 일반적으로 가능한 한 HttpClient 인스턴스를 재사용하는 것이 좋습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.