이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 9666|회답: 7

[출처] ASP.NET 코어(XV)는 HTTP 요청을 보낼 때 HttpClient를 사용합니다

[링크 복사]
게시됨 2022. 5. 14. 오후 7:37:21 | | | |
ASP.NET 로 애플리케이션을 만들 때, HttpClient 클래스의 인스턴스를 사용하여 HTTP 요청을 보냅니다. HttpClient 사용은 간단해 보일 수 있습니다. 하지만 일부 잠재적 문제는 애플리케이션이 무거운 부하를 받을 때까지는 발견되지 않습니다.

.NET에서 제공된 원래 HttpClient 클래스와 관련된 문제들:하이퍼링크 로그인이 보입니다.

HttpClient는 IDisposable을 구현할 때, using 문에서 이를 선언하고 인스턴스화하는 것이 선호되는 연산이 아닙니다.HttpClient 객체를 해제할 때, 기본 소켓은 그렇지 않습니다즉시석방, 이로 인해 소켓 소진 문제가 발생할 수 있습니다.

문제는 HttpClient 자체가 아니라 HttpClient의 기본 생성자에 있습니다. 이는 위에서 언급한 "소켓 소갈"과 DNS 변경 문제를 가진 새로운 실제 HttpMessageHandler 인스턴스를 생성합니다.



HttpClient 직접 생성하기 (잘못된 사용)

HttpClient 객체를 직접 인스턴스화하고, Dispose 메서드 호출을 보장하기 위해 사용하는 코드를 추가하면 다음과 같습니다:

인터페이스를 5번 호출하고, HttpClient를 사용해 HTTP 요청을 보내고, 다음 명령어로 네트워크 연결을 확인하세요:

HttpClient가 해제될 때 로컬 컴퓨터와 대상 서버 간의 연결은 다음과 같습니다TIME_WAIT동시성이 높은 경우, 오류는 다음과 같이 보고됩니다:

원격 서버에 연결할 수 없습니다
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


궁금한 점이 있으시면 다음을 참고하실 수 있습니다:

HttpClinet을 잘못 사용하면 소프트웨어가 망가질 수 있습니다
https://www.itsvse.com/thread-10310-1-1.html
IHttpClientFactory로 HttpClinet 생성 (올바른 사용법)

DI 의존성 주입 IHttpClientFactory를 사용하는 것은 IHttpClientFactory를 사용해 생성되는 HttpLinet과 동일합니다.

서비스를 시작 파일에 추가하면 코드는 다음과 같습니다:

HomeController 컨트롤러 코드는 다음과 같습니다:

또한 HttpClinet을 사용해 호출 인터페이스를 통해 5개의 요청을 보내고, 기계는 대상 서버와만 연결을 설정하며, 요청 과정 중에 연결을 재사용합니다. 아래에 나와 있습니다:



IHttpClientFactory는 자원 소비를 줄이기 위해 공장에서 생성된 HttpMessageHandler 인스턴스를 풀로 풀링합니다. 새로운 HttpClient 인스턴스를 생성할 때, 수명이 만료되지 않았다면 HttpMessageHandler 인스턴스를 풀에서 재사용할 수 있습니다.

{
    "평생": "싱글턴",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "평생": "싱글턴",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory는 기본적으로 DefaultHttpClientFactory로 구현되며, 소스 코드 주소는 다음과 같습니다:하이퍼링크 로그인이 보입니다.

DI가 활성화된 애플리케이션에서 IHttpClientFactory를 사용하면 다음을 피할 수 있습니다:

  • HttpMessageHandler 인스턴스를 공유하여 자원 고갈 문제를 해결하세요.
  • DNS 정체성 문제를 해결하려면 주기적으로 HttpMessageHandler 인스턴스를 루프 처리하세요.


또한, 장기 수명 소켓 HttpHandler 인스턴스를 사용하여 위 문제를 해결하는 다른 방법들도 있습니다.

  • 앱 시작 시 SocketsHttpHandler 인스턴스를 생성하고 앱 수명 주기 전반에 걸쳐 사용하세요.
  • DNS 갱신 시간에 따라 PooledConnectionLifetime을 적절한 값으로 설정하세요.
  • 필요에 따라 새로운 HttpClient(핸들러, disposeHandler: false)를 사용하여 HttpClient 인스턴스를 생성하세요.


위의 접근법은 IHttpClientFactory와 유사한 방식으로 자원 관리 문제를 해결합니다.

  • HttpClient 인스턴스 간의 소켓 HttpHandler공유 연결。 이 공유는 소켓 고갈을 방지합니다.
  • 소켓 HttpHandler는 DNS 정체성을 방지하기 위해 PooledConnectionLifetime을 기반으로 연결을 루프합니다.


더 자세한 사용 및 구성은 다음을 참고하시기 바랍니다:

하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.





이전의:HttpClient를 잘못 사용하면 소프트웨어가 망가질 수 있습니다
다음:jQuery Datatables 국제화 플러그인
 집주인| 게시됨 2022. 5. 14. 오후 7:38:14 |
복습

ASP.NET 코어(14)는 SkiaSharp 이미지 캡차를 기반으로 합니다
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core(XIII)를 통해 Ajax 요청인지 여부를 판단할 수 있습니다
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET 코어(12개) 프론트엔드 JS, CSS 번들링, 압축
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET 코어(XI) 엔드포인트 경로는 모든 DI 서비스를 표시하는 미들웨어를 추가합니다
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Core(10)에서의 구성 우선순위에 대한 상세 설명.
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Core (9)의 미들웨어 미들웨어에 대한 상세한 설명.
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET 코어 미들웨어에 대한 상세한 설명
https://www.itsvse.com/thread-8126-1-1.html

Core(8) Swagger UI 기본 매개변수의 ASP.NET 구멍입니다.
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET 핵심 (7) 프레임워크 소스 코드에 대한 심층 분석
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET 코어(VI) DI는 객체 주입 방식을 수동으로 획득합니다
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET 코어(다섯 개)는 CAP 분산 트랜잭션을 기반으로 합니다
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET 코어(4) 필터 통합 모델스테이트 모델 검증
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET 코어 (iii) ActivatorUtilities를 사용하여 동적으로 인스턴스를 생성합니다
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET 코어 (2) 코드로 애플리케이션을 재시작함
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET 코어(1)는 Redis 캐싱을 사용합니다
https://www.itsvse.com/thread-9393-1-1.html
 집주인| 게시됨 2022. 5. 14. 오후 7:41:13 |
게시됨 2022. 5. 14. 오후 10:36:06 |
배우세요
게시됨 2022. 5. 19. 오전 9:45:12 |
자, 곧 시작해요, 속편을 확인해 보세요
게시됨 2022. 8. 18. 오후 4:13:45 |
멋진 학습과 학습
 집주인| 게시됨 2023. 6. 24. 오후 1:07:32 |
.NET/C# Http클라이언트 소스 코드 간단한 분석
https://www.itsvse.com/thread-10617-1-1.html
 집주인| 게시됨 2024. 9. 5. 오후 2:35:55 |
HttpClientFactoryServiceCollectionExtensions 소스 코드를 확인해 보세요

IHttpClientFactory의 기본 구현은 다음과 같습니다.DefaultHttpClientFactory, 아래 그림에서 볼 수 있습니다:



DefaultHttpClientFactory의 CreateClient 메서드는 HttpClient 객체를 인스턴스화합니다disposeHandler: false, 아래 그림에서 볼 수 있습니다:



면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com