Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
Het HttpClient klasse-exemplaar fungeert als een sessie voor het verzenden van HTTP-aanvragen. Een HttpClient exemplaar is een verzameling instellingen die worden toegepast op alle aanvragen die door dat exemplaar worden uitgevoerd. Bovendien maakt elk HttpClient exemplaar gebruik van een eigen verbindingsgroep, waarbij de aanvragen worden geïsoleerd van aanvragen die door andere HttpClient instanties worden uitgevoerd.
Instantiering
HttpClient is bedoeld om eenmalig te worden geïnstantieerd en hergebruikt gedurende de levensduur van een toepassing. In .NET Core en .NET 5+ HttpClient worden verbindingen binnen het handler-exemplaar gegroepeerd en wordt een verbinding opnieuw gebruikt voor meerdere aanvragen. Als u een HttpClient klasse instantieert voor elke aanvraag, wordt het aantal sockets dat beschikbaar is onder zware belastingen uitgeput. Deze uitputting leidt tot SocketException fouten.
U kunt extra opties configureren door een 'handler' door te geven, zoals HttpClientHandler (of SocketsHttpHandler in .NET Core 2.1 of hoger), als onderdeel van de constructor. De verbindingseigenschappen op de handler kunnen niet worden gewijzigd zodra een aanvraag is ingediend, dus een reden om een nieuw HttpClient exemplaar te maken, is als u de verbindingseigenschappen moet wijzigen. Als verschillende aanvragen verschillende instellingen vereisen, kan dit ook leiden tot een toepassing met meerdere HttpClient exemplaren, waarbij elk exemplaar op de juiste wijze is geconfigureerd en vervolgens aanvragen worden uitgegeven op de relevante client.
Alleen HttpClient zet DNS-vermeldingen om wanneer er een verbinding wordt gemaakt. Er wordt geen time to live -duur (TTL) bijgehouden die is opgegeven door de DNS-server. Als DNS-vermeldingen regelmatig worden gewijzigd, wat in sommige containerscenario's kan gebeuren, respecteert de client deze updates niet. U kunt dit probleem oplossen door de levensduur van de verbinding te beperken door de SocketsHttpHandler.PooledConnectionLifetime eigenschap in te stellen, zodat DNS-zoekacties vereist zijn wanneer de verbinding wordt vervangen.
public class GoodController : ApiController
{
private static readonly HttpClient httpClient;
static GoodController()
{
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(2)
};
httpClient = new HttpClient(socketsHandler);
}
}
Als alternatief voor het maken van slechts één HttpClient exemplaar, kunt u ook IHttpClientFactory gebruiken om de HttpClient exemplaren voor u te beheren. Zie Richtlijnen voor het gebruik van HttpClient voor meer informatie.
Afleiding
De HttpClient functie fungeert ook als basisklasse voor specifiekere HTTP-clients. Een voorbeeld hiervan is een FacebookHttpClient methode die aanvullende methoden biedt die specifiek zijn voor een Facebook-webservice (bijvoorbeeld een GetFriends methode). Afgeleide klassen mogen de virtuele methoden in de klasse niet overschrijven. Gebruik in plaats daarvan een constructor overload die HttpMessageHandler accepteert om eventuele voor-aanvraag- of na-aanvraagverwerking te configureren.
Transporten
Het HttpClient is een API op hoog niveau die de functionaliteit op lager niveau verpakt die beschikbaar is op elk platform waarop deze wordt uitgevoerd.
Op elk platform HttpClient probeert u het best beschikbare transport te gebruiken:
| Host/runtime | backend |
|---|---|
| Windows/.NET Framework | HttpWebRequest |
| Windows/Mono | HttpWebRequest |
| Windows/UWP | Windows native WinHttpHandler (compatibel met HTTP 2.0) |
| Windows/.NET Core 1.0-2.0 | Windows native WinHttpHandler (compatibel met HTTP 2.0) |
| macOS/Mono | HttpWebRequest |
| macOS/.NET Core 1.0-2.0 |
libcurlHTTP-transport op basis van HTTP (geschikt voor HTTP 2.0) |
| Linux/Mono | HttpWebRequest |
| Linux/.NET Core 1.0-2.0 |
libcurlHTTP-transport op basis van HTTP (geschikt voor HTTP 2.0) |
| .NET Core 2.1 en hoger | System.Net.Http.SocketsHttpHandler |
Gebruikers kunnen ook een specifiek transport voor HttpClient configureren door de HttpClient-constructor aan te roepen die een HttpMessageHandler ontvangt.
.NET Framework & Mono
Standaard wordt HttpWebRequest gebruikt om aanvragen naar de server te verzenden op .NET Framework en Mono. Dit gedrag kan worden gewijzigd door een andere handler op te geven in een van de constructor-overbelastingen met een HttpMessageHandler parameter. Als u functies zoals verificatie of caching nodig hebt, kunt u de instellingen configureren met behulp van WebRequestHandler en kan het exemplaar worden doorgegeven aan de constructor. De geretourneerde handler kan worden doorgegeven aan een constructoroverload met een HttpMessageHandler-parameter.
.NET Kern
Vanaf .NET Core 2.1 biedt de System.Net.Http.SocketsHttpHandler klasse in plaats van HttpClientHandler de implementatie die wordt gebruikt door HTTP-netwerkklassen op een hoger niveau, zoals HttpClient. Het gebruik van SocketsHttpHandler biedt een aantal voordelen:
- Een aanzienlijke prestatieverbetering in vergelijking met de vorige implementatie.
- Het verwijderen van platformafhankelijkheden, wat de implementatie en het onderhoud vereenvoudigt. Bijvoorbeeld,
libcurlis niet langer een afhankelijkheid van .NET Core voor macOS en .NET Core voor Linux. - Consistent gedrag voor alle .NET-platforms.
Als deze wijziging ongewenst is, kunt u in Windows doorgaan met gebruik van WinHttpHandler door te verwijzen naar het NuGet-pakket en deze handmatig aan de constructor van HttpClient door te geven.
Gedrag configureren met runtimeconfiguratieopties
Bepaalde aspecten van HttpClient's gedrag kunnen worden aangepast via runtime-configuratieopties. Het gedrag van deze switches verschilt echter via .NET-versies. In .NET Core 2.1 - 3.1 kunt u bijvoorbeeld configureren of SocketsHttpHandler deze standaard wordt gebruikt, maar die optie is niet meer beschikbaar vanaf .NET 5.
Groepsgewijze verbindingen
HttpClient pools HTTP-verbindingen waar mogelijk en gebruikt deze voor meer dan één aanvraag. Dit kan een aanzienlijk prestatievoordeel hebben, met name voor HTTPS-aanvragen, omdat de handshake van de verbinding slechts eenmaal wordt uitgevoerd.
Eigenschappen van verbindingsgroepen kunnen worden geconfigureerd op een HttpClientHandler of SocketsHttpHandler, en meeggegeven tijdens de constructie, inclusief MaxConnectionsPerServer, PooledConnectionIdleTimeout en PooledConnectionLifetime.
Het verwijderen van de HttpClient instantie sluit de geopende verbindingen en annuleert eventuele aanvragen die in behandeling zijn.
Opmerking
Als u gelijktijdig HTTP/1.1-aanvragen naar dezelfde server verzendt, kunnen nieuwe verbindingen worden gemaakt. Zelfs als u het HttpClient exemplaar opnieuw gebruikt, als de frequentie van aanvragen hoog is of als er firewallbeperkingen zijn, kan dit de beschikbare sockets uitputten vanwege standaard-TCP-opschoontimers. Als u het aantal gelijktijdige verbindingen wilt beperken, kunt u de MaxConnectionsPerServer eigenschap instellen. Standaard is het aantal gelijktijdige HTTP/1.1-verbindingen onbeperkt.
Buffering en levensduur van verzoeken
HttpClient Standaard bufferen methoden (behalve GetStreamAsync) de reacties van de server, waardoor alle hoofdtekst van het antwoord in het geheugen wordt gelezen voordat het asynchrone resultaat wordt geretourneerd. Deze aanvragen worden voortgezet totdat een van de volgende handelingen plaatsvindt:
- De Task<TResult> bewerking slaagt en retourneert een resultaat.
- Het Timeout is bereikt, in welk geval het Task<TResult> wordt geannuleerd.
- De CancellationToken passable voor sommige methode-overbelastingen wordt geactiveerd.
- CancelPendingRequests() wordt aangeroepen.
- De HttpClient wordt verwijderd.
U kunt het buffergedrag per aanvraag wijzigen met behulp van de HttpCompletionOption parameter die beschikbaar is voor bepaalde overbelastingen van methoden. Dit argument kan worden gebruikt om op te geven of het Task<TResult> moet worden beschouwd als voltooid na het lezen van alleen de antwoordheaders, of na het lezen en bufferen van de antwoordinhoud.
Als uw app die gebruikmaakt HttpClient van en gerelateerde klassen in de System.Net.Http naamruimte grote hoeveelheden gegevens wil downloaden (50 megabytes of meer), moet de app deze downloads streamen en niet de standaardbuffering gebruiken. Als u de standaardbuffering gebruikt, wordt het geheugengebruik van de client erg groot, waardoor de prestaties aanzienlijk kunnen verminderen.
Schroefdraadveiligheid
De volgende methoden zijn thread-veilig:
- CancelPendingRequests
- DeleteAsync
- GetAsync
- GetByteArrayAsync
- GetStreamAsync
- GetStringAsync
- PostAsync
- PutAsync
- SendAsync
Proxy's
HttpClient Leest standaard proxyconfiguratie uit omgevingsvariabelen of gebruikers-/systeeminstellingen, afhankelijk van het platform. U kunt dit gedrag wijzigen door een WebProxy of IWebProxy door te geven, in volgorde van prioriteit:
- Het Proxy eigenschap van een
HttpClientHandlerdoorgegeven tijdensHttpClientconstructie - De DefaultProxy statische eigenschap (heeft invloed op alle exemplaren)
U kunt de proxy uitschakelen met behulp van UseProxy. De standaardconfiguratie voor Windows-gebruikers is het proberen en detecteren van een proxy met behulp van netwerkdetectie, wat traag kan zijn. Voor toepassingen met hoge doorvoer waar bekend is dat een proxy niet vereist is, moet u de proxy uitschakelen.
Proxy-instellingen (zoals Credentials) moeten alleen worden gewijzigd voordat de eerste aanvraag wordt gedaan met behulp van de HttpClient. Wijzigingen die zijn aangebracht nadat u de HttpClient eerste keer hebt gebruikt, worden mogelijk niet doorgevoerd in volgende aanvragen.
Onderbrekingen
Gebruik Timeout om een standaardtime-out in te stellen voor alle HTTP-aanvragen van de HttpClient instantie. De time-out is alleen van toepassing op de xxxAsync-methoden die ervoor zorgen dat een aanvraag/antwoord wordt gestart. Als de time-out is bereikt, wordt de Task<TResult> aanvraag geannuleerd.
U kunt enkele extra timeouts instellen als u een SocketsHttpHandler instantie doorgeeft bij het aanmaken van het HttpClient object.
| Vastgoed | Beschrijving |
|---|---|
| ConnectTimeout | Hiermee geeft u een time-out op die wordt gebruikt wanneer voor een aanvraag een nieuwe TCP-verbinding moet worden gemaakt. Als de time-out optreedt, wordt de aanvraag Task<TResult> geannuleerd. |
| PooledConnectionLifetime | Hiermee geeft u een time-out op die moet worden gebruikt voor elke verbinding in de verbindingsgroep. Als de verbinding niet actief is, wordt de verbinding onmiddellijk gesloten; anders wordt de verbinding aan het einde van de huidige aanvraag gesloten. |
| PooledConnectionIdleTimeout | Als een verbinding in de verbindingsgroep gedurende deze periode niet actief is, wordt de verbinding gesloten. |
| Expect100ContinueTimeout | Als het verzoek een header 'Expect: 100-continue' heeft, wordt het verzenden van inhoud vertraagd tot de timeout of totdat een '100-continue'-antwoord wordt ontvangen. |
HttpClient lost alleen DNS-vermeldingen op wanneer de verbindingen worden gemaakt. Er wordt geen time to live -duur (TTL) bijgehouden die is opgegeven door de DNS-server. Als DNS-records regelmatig worden gewijzigd, wat in sommige containerscenario's kan gebeuren, kunt u de levensduur van de verbinding beperken, zodat een DNS-zoekopdracht vereist is wanneer de verbinding wordt vervangen.