Hoe gebruik je een proxy met HttpClient in C#: patronen en oplossingen

Laatst bijgewerkt op June 1, 2026
Hoe gebruik je een proxy met HttpClient in C#: patronen en oplossingen
AI-samenvatting
Configureer proxies in C# met HttpClient door credentials op het WebProxy-object in te stellen. Volg deze patronen voor proxyrotatie in productie in 2026.

Vorige week zat ik gênant lang naar een 407 Proxy Authentication Required-melding te staren, ervan overtuigd dat mijn proxyprovider kapot was. Bleek dat ik de inloggegevens op het verkeerde property had gezet — een oplossing van twee regels die me twee uur kostte om te vinden. Klinkt dat bekend? Dan is deze gids voor jou.

Proxyconfiguratie met HttpClient in C# is zo’n onderwerp waarbij het basispatroon simpel lijkt, maar de valkuilen in productie — socket exhaustion, SOCKS5-versieverschillen, verwarring over credentials — je in de praktijk veel tijd kosten.

Bij Thunderbit werk ik al een tijdje aan tools voor webscraping en data-extractie, en ik zie deze fouten steeds weer terugkomen, zowel in onze technische discussies als in de developersgemeenschappen die we volgen. Deze walkthrough behandelt het hele traject: setup, authenticatie, proxy-rotatie, protocolkeuze en een troubleshooting-tabel waarvan ik echt had gewild dat die er was toen ik begon.

Moeilijkheidsgraad: Beginner tot gemiddeld
Benodigde tijd: ongeveer 15 minuten om mee te volgen, langer voor rotatiepatronen in productie
Wat je nodig hebt: .NET 6+ SDK (voor SOCKS5 en moderne handler-functies; .NET Framework 4.x werkt voor basisvoorbeelden met HTTP-proxy), een code-editor en ten minste één proxy-endpoint om mee te testen

Wat is HttpClient en waarom heeft het een proxy nodig?

csharp-app-httpclient-proxy-flow.webp

HttpClient is de ingebouwde .NET-klasse in System.Net.Http voor het versturen van HTTP-verzoeken en het ontvangen van responses. De klasse ondersteunt async/await, custom headers, cancellation tokens en configuratie via handlers. Microsoft beschrijft het als een klasse voor het versturen van HTTP-verzoeken en het ontvangen van HTTP-responses van een resource die wordt geĂŻdentificeerd door een URI.

Een proxyserver is een tussenlaag tussen je applicatie en de doelwebsite. Als je verkeer via een proxy routeert, ziet de doelserver het IP-adres van de proxy in plaats van jouw eigen IP.

HttpClient zelf heeft geen Proxy-property. Proxy-routing configureer je op de onderliggende handler — of dat nu HttpClientHandler of SocketsHttpHandler is — en die accepteert een WebProxy-instantie. Het mentale model ziet er zo uit:

[Je C#-app] → [HttpClient + Handler] → [Proxyserver] → [Doelwebsite]

Daarom is “de proxy wijzigen op een live HttpClient” een ontwerpvraagstuk, geen simpele property-toekenning. Meer daarover in het gedeelte over rotatie.

Probeer Thunderbit voor eenvoudigere data-extractie

Waarom een proxy gebruiken met HttpClient in C#

Ontwikkelaars sturen HttpClient-verkeer om een aantal terugkerende redenen via proxies, en het juiste proxytype hangt af van de taak.

  • IP-blokkades en rate limits vermijden: Essentieel voor webscraping, leadgeneratie of prijsmonitoring op schaal. Een enkel IP dat een site maar blijft bestoken, wordt snel geblokkeerd.
  • Geo-beperkingen omzeilen: Krijg toegang tot regio-gebonden API’s of content door via proxies in specifieke landen te routeren.
  • Je bron-IP verbergen: Voeg een extra privacylaag toe voor gevoelige data-collectie of competitief onderzoek.
  • Bedrijfs- of compliance-eisen: Veel organisaties eisen dat uitgaand verkeer via een centrale gateway loopt voor logging en governance.
  • Testen en QA: Simuleer requests uit verschillende locaties of netwerkcondities zonder infrastructuur fysiek in die regio’s uit te rollen.
GebruikssituatieTypische proxykeuzeWaarom dit past
Webscraping op schaalRoterende residential proxiesMeer IP-diversiteit, moeilijker te classificeren door anti-bot systemen
Prijsmonitoring voor e-commerceResidential of geo-gerichte datacenterproxyRegionale prijs- en voorraadcontroles
API-toegang via een vaste gatewayDatacenterproxy of bedrijfsproxyVoorspelbare IP-allowlisting, lagere kosten
Enterprise complianceSysteemproxy, PAC-proxy, geauthenticeerde bedrijfsproxyGecentraliseerde logging en uitgaande controle
QA- en lokalisatietestenLand-specifieke proxy poolSimuleert echte gebruikersuitvoer vanuit doelregio’s

Proxygebruik schaalt meestal in duidelijke fases. Je begint met één statische proxy om de routing te bevestigen. Een production scraper gaat over op een pool, waarbij requests worden gemapt naar proxies op basis van doel-domein, geografie of foutpercentage. Volwassen teams stappen vaak over op een beheerde proxygateway, waarbij rotatie, retries en session affinity achter één endpoint worden afgehandeld.

Proxy-rotatie is geen wondermiddel. Als een target verdacht gedrag blokkeert, helpt rotatie van IP’s alleen echt als requestfrequentie, headers, cookies en TLS-fingerprinting ook zorgvuldig worden behandeld.

Welke .NET-versie ondersteunt wat: een snelle compatibiliteitsmatrix

Een proxy-snippet uit een blogpost in het verkeerde target framework plakken is een grote bron van stille fouten. De belangrijkste scheidslijn is .NET Framework 4.x versus moderne .NET (.NET 6+). Dit werkt waar:

.net-version-comparison.webp

Mogelijkheid.NET Framework 4.x.NET 6.NET 7.NET 8–9
WebProxy + HttpClientHandlerJaJaJaJa
SOCKS5 via WebProxy("socks5://...")NeeJa (toegevoegd in .NET 6)JaJa
SocketsHttpHandler (standaard handler)NeeJaJaJa
HttpClient.DefaultProxy statischNeeJaJaJa
PooledConnectionLifetimeNeeJaJaJa

Als je op .NET Framework 4.x mikt, blijf dan bij HTTP/HTTPS-proxies met HttpClientHandler en WebProxy. SOCKS5 en moderne pooling-control vereisen .NET 6 of hoger.

Een subtiel gedragspunt: HttpClient.DefaultProxy is in moderne .NET een statische property. Als die wordt gezet in gedeelde startup-code of wordt geërfd van omgevingsvariabelen zoals HTTPS_PROXY of HTTP_PROXY, pakt elke HttpClient-instantie die op, tenzij je de handler expliciet overschrijft. In containerized deployments is dit een veelvoorkomende oorzaak van verwarring: “waarom gebruikt mijn client een proxy die ik nooit heb ingesteld?”

Stap 1: Maak een nieuw C# consoleproject aan

Open een terminal en zet een nieuw project op:

dotnet new console -n ProxyHttpClientDemo
cd ProxyHttpClientDemo

Controleer je SDK-versie met dotnet --version. De voorbeelden in deze gids richten zich op .NET 6+ voor volledige functionaliteit. Als je de nieuwste LTS SDK nodig hebt, haal die dan via de downloadpagina van Microsoft.

Open Program.cs in je editor. Daar gebeurt alles.

Stap 2: Maak een basis HTTP-request zonder proxy

Voordat je een proxy instelt, moet je je echte uitgaande IP vaststellen. Zo kun je, zodra de proxy actief is, controleren of het IP daadwerkelijk is veranderd.

using System.Net.Http;

using var client = new HttpClient();
var ip = await client.GetStringAsync("https://api.ipify.org/");
Console.WriteLine($"Direct IP: {ip}");

Voer het uit. Je zou je huidige publieke IP-adres moeten zien, bijvoorbeeld:

Direct IP: 203.0.113.10

Onthoud die waarde. Na de volgende stap moet die anders zijn.

Stap 3: Configureer een WebProxy met HttpClientHandler

Het klassieke patroon bestaat uit drie objecten: een WebProxy, een handler en de client.

using System.Net;
using System.Net.Http;

var proxy = new WebProxy("http://proxy.example.com:8080")
{
    BypassProxyOnLocal = false
};

var handler = new HttpClientHandler
{
    Proxy = proxy,
    UseProxy = true,
    UseDefaultCredentials = false
};

using var client = new HttpClient(handler);
var ip = await client.GetStringAsync("https://api.ipify.org/");
Console.WriteLine($"Proxy IP: {ip}");

Vervang proxy.example.com:8080 door je eigen proxy-endpoint. Als alles goed is geconfigureerd, moet het output-IP nu overeenkomen met het exit-IP van je proxy — niet met je echte IP.

Belangrijke properties om te begrijpen:

  • Proxy — de IWebProxy-instantie die de handler gebruikt voor routing.
  • UseProxy = true — vertelt de handler om de ingestelde proxy daadwerkelijk te gebruiken. (Klinkt logisch, maar het vergeten hiervan kost in de praktijk veel debugtijd.)
  • BypassProxyOnLocal = false — zorgt ervoor dat de handler de proxy niet overslaat voor bestemmingen die als “lokaal” worden gezien.
  • UseDefaultCredentials — bepaalt of de handler Windows-defaultcredentials meestuurt. Dit is niet hetzelfde als een proxygebruikersnaam en -wachtwoord.

proxy-ip-flowchart.webp

Stap 4: Voeg proxy-authenticatie toe met NetworkCredential

De meeste betaalde proxyproviders vereisen credentials. Het juiste patroon is om die op het WebProxy-object zelf te zetten:

using System.Net;
using System.Net.Http;

var proxy = new WebProxy("http://proxy.example.com:8080")
{
    Credentials = new NetworkCredential("proxy-user", "proxy-password")
};

var handler = new HttpClientHandler
{
    Proxy = proxy,
    UseProxy = true
};

using var client = new HttpClient(handler);
var ip = await client.GetStringAsync("https://api.ipify.org/");
Console.WriteLine($"Authenticated proxy IP: {ip}");

Veel providers geven een URL-formaat zoals http://username:password@host:port. Voor .NET-code is NetworkCredential meestal beter dan credentials in de URI-string zetten. Daarmee voorkom je problemen met speciale tekens in wachtwoorden en houd je het onderscheid tussen URI en credentials expliciet.

Ik behandel de meest voorkomende authenticatiefout — en waarom die 407-fouten veroorzaakt — in een apart gedeelte hieronder.

Stap 5: Gebruik of exporteer de responsdata

Voor alles wat verder gaat dan een snelle IP-check, moet je de response netjes verwerken:

using var response = await client.GetAsync("https://example.com/api/products");

if (!response.IsSuccessStatusCode)
{
    Console.WriteLine($"Request mislukt: {(int)response.StatusCode} {response.ReasonPhrase}");
    return;
}

var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);

Voor scraping-workflows is de proxied request alleen de transportlaag. Je hebt nog steeds parsing, normalisatie, deduplicatie, retries en export naar Excel, Google Sheets, databases of andere bestemmingen nodig. Tools zoals Thunderbit kunnen de extractie- en exportstappen automatiseren — de Chrome-extensie verwerkt gestructureerde data-extractie en gratis exports naar Google Sheets, Excel, Airtable of Notion, zonder dat je parsingcode hoeft te schrijven.

Exporteer gescrapete data naar Excel, Sheets, Airtable of Notion Get Started Free

Proxy-credentials versus server-credentials: de fout die 407-fouten veroorzaakt

proxy-authentication-diagram.webp

Ik heb deze fout gezien in Stack Overflow-threads, Microsoft Q&A-posts en — eerlijk is eerlijk — in mijn eigen code.

Het onderscheid is simpel, maar makkelijk te verwarren:

  • Proxy-credentials authenticeren je bij de proxyserver zelf.
  • Server-credentials authenticeren je bij de doelserver.

In HttpClientHandler zitten die op verschillende properties. Credentials op de verkeerde plek zetten is de nummer 1 oorzaak van 407 Proxy Authentication Required-fouten.

// ❌ FOUT — zet credentials voor de doelserver, niet voor de proxy
handler.Credentials = new NetworkCredential("user", "pass");

// ✅ GOED — zet credentials op het proxy-object zelf
handler.Proxy = new WebProxy("http://proxy:8080")
{
    Credentials = new NetworkCredential("user", "pass")
};

HttpClientHandler.Credentials is voor de doelserver. WebProxy.Credentials is voor de proxy. Krijg je een 407 terug, dan horen je credentials op de proxy.

Nog een valkuil: HttpClientHandler.PreAuthenticate stuurt gedrag aan voor authenticatie bij de doelserver. Het regelt niet de Proxy-Authorization-header. Gebruik dit dus niet als oplossing voor 407.

Hoe roteer je proxies met HttpClient in C#

Ontwikkelaars vragen dit voortdurend in forums. Het antwoord is in eerste instantie teleurstellend: je kunt de proxy van een live HttpClient-instantie niet wijzigen. De proxy zit op de handler. De handler wordt ingesteld bij het aanmaken. HttpClient biedt geen veranderbare Proxy-property.

De naïeve workaround — voor elk request new HttpClient(new HttpClientHandler { Proxy = ... }) maken — creëert een ander probleem. Microsoft waarschuwt expliciet dat clients per request aanmaken en direct weggooien TCP-poorten kan uitputten, omdat poorten niet meteen vrijkomen na het sluiten van de verbinding.

proxy-client-lifetime-routing.webp

Hier zijn dus drie productieklare patronen die echt werken.

Optie 1: Named clients via IHttpClientFactory

Als je proxyset al bij startup bekend is, zijn named clients de eenvoudigste optie. Elke named client krijgt zijn eigen handlerconfiguratie en je applicatie kiest op runtime op naam.

builder.Services.AddHttpClient("proxy-us")
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
    {
        Proxy = new WebProxy("http://us-proxy.example.com:8080")
        {
            Credentials = new NetworkCredential("user", "pass")
        },
        UseProxy = true
    });

builder.Services.AddHttpClient("proxy-eu")
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
    {
        Proxy = new WebProxy("http://eu-proxy.example.com:8080")
        {
            Credentials = new NetworkCredential("user", "pass")
        },
        UseProxy = true
    });

// Tijdens een request:
var client = httpClientFactory.CreateClient("proxy-us");

De factory beheert de levensduur van handlers en voorkomt het anti-patroon van een client per request.

Optie 2: SocketsHttpHandler + PooledConnectionLifetime (.NET 6+)

Voor een langdurig draaiende client achter een proxygateway die exit-IP’s roteert op nieuwe verbindingen, dwingt PooledConnectionLifetime af dat verbindingen na een ingestelde tijd opnieuw worden aangemaakt.

var handler = new SocketsHttpHandler
{
    Proxy = new WebProxy("http://rotating-gateway.example.com:8080")
    {
        Credentials = new NetworkCredential("user", "pass")
    },
    UseProxy = true,
    PooledConnectionLifetime = TimeSpan.FromMinutes(5)
};

using var client = new HttpClient(handler);

Dit verandert niet magisch het Proxy-object per request. Het werkt vooral goed met proxygateways die bij elke nieuwe TCP-verbinding een ander exit-IP toewijzen, of met DNS-gestuurde proxy pools waarbij de hostname in de tijd naar andere endpoints resolveert.

Optie 3: Custom DelegatingHandler voor geavanceerde proxyselectie

Wanneer proxyselectie afhangt van de request-URL, payload of runtime-context, kan een custom routing handler elk request inspecteren en doorsturen naar de juiste inner handler pipeline.

public sealed class ProxyRoutingHandler : DelegatingHandler
{
    private readonly IReadOnlyDictionary<string, HttpMessageInvoker> _clients;

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        var key = SelectProxyKey(request);
        return _clients[key].SendAsync(request, cancellationToken);
    }
}

Dit is een geavanceerde aanpak. Thread safety, disposal, hergebruik van handlers, retry-gedrag en logging worden dan jouw verantwoordelijkheid. Ik zou dit alleen aanraden als de eerste twee opties echt niet passen.

De drie aanpakken vergeleken

AanpakComplexiteit.NET-versieThread safetyOverhead
Named clients (IHttpClientFactory)Laag.NET Core 2.1+Hoog (immutabele configuratie)Laag
SocketsHttpHandler + PooledConnectionLifetimeGemiddeld.NET 6+HoogLaag
Custom DelegatingHandlerHoogElkeHangt af van implementatieGemiddeld

Voor de meeste teams zijn named clients het beste startpunt. Stap over op PooledConnectionLifetime voor stabiele roterende gateways, en gebruik custom routing alleen wanneer de proxykeuze afhangt van metadata op requestniveau.

Kies het juiste proxyprotocol: HTTP, HTTPS en SOCKS5

Niet alle proxies spreken dezelfde taal, en als je het verkeerde protocol of schema gebruikt, krijg je verwarrende fouten.

HTTP-proxy: Begrijpt HTTP-verzoeken. Voor gewone HTTP-targets kan hij requests direct doorsturen. Voor HTTPS-targets stuurt de client een CONNECT-request om een tunnel op te zetten, waarna TLS via die tunnel met de doelserver wordt onderhandeld. Dit is het meest gangbare model.

HTTPS-terminerende proxy: De proxy presenteert zijn eigen TLS-certificaat en versleutelt upstream-verkeer opnieuw. Dit zie je vaak in enterprise-inspectiesystemen en sommige beheerde scraping-API’s. Dit kan certificaatvalidatiefouten veroorzaken als de client de certificaatketen van de proxy niet vertrouwt.

SOCKS5-proxy: Een TCP-tunnel op transportlaag die werkt voor alle TCP-verkeer, niet alleen HTTP. Veel gebruikt door providers van residential proxies. Natief ondersteund in .NET 6+.

SOCKS5-voorbeeld:

var handler = new SocketsHttpHandler
{
    Proxy = new WebProxy("socks5://proxy.example.com:1080")
    {
        Credentials = new NetworkCredential("proxy-user", "proxy-password")
    },
    UseProxy = true
};

using var client = new HttpClient(handler);
var ip = await client.GetStringAsync("https://api.ipify.org/");
Console.WriteLine(ip);

Een opmerking over SSL-certificaatvalidatie

Bij HTTPS-terminerende proxies kun je RemoteCertificateNameMismatch-fouten zien. De ServerCertificateCustomValidationCallback kan de validatie aanpassen:

var handler = new HttpClientHandler
{
    ServerCertificateCustomValidationCallback =
        HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};

Gebruik dit alleen in lokale ontwikkeling of met een vertrouwde, goedgekeurde TLS-interceptieproxy. Blind true teruggeven schakelt een kritieke beveiligingscontrole uit en maakt je vatbaar voor man-in-the-middle-aanvallen. In productie, met standaard CONNECT- of SOCKS-proxies, moet SSL-validatie gewoon aan blijven.

Veelvoorkomende proxyfouten in C# HttpClient oplossen

troubleshoot-httpclient-proxy-flowchart.webp

Deze tabel koppelt het zichtbare symptoom aan de waarschijnlijke oorzaak en de eerste fix die je moet proberen. Bookmark dit gedeelte gerust — het behandelt de fouten die het vaakst opduiken in Stack Overflow-threads en developersforums.

Fout / symptoomVeelvoorkomende oorzaakOplossing
407 Proxy Authentication RequiredCredentials gezet op handler.Credentials in plaats van handler.Proxy.Credentials; verkeerd gebruikersnaamformaat; speciale tekens in een wachtwoord dat in de URL is ingebedGebruik WebProxy.Credentials = new NetworkCredential(...); stop credentials niet in de URI; controleer het gebruikersnaamformaat van de provider
TaskCanceledException / TimeoutProxy-endpoint is traag, onbereikbaar, overbelast of door firewall geblokkeerd; standaard timeout van 100s is te kortTest de proxy met curl; verhoog HttpClient.Timeout pas nadat je hebt bewezen dat het endpoint werkt; voeg retries en health checks toe
SocketException / Socket exhaustionHttpClient of handlers per request aanmaken en weggooienGebruik IHttpClientFactory, singleton clients of SocketsHttpHandler met pooling controls
SSL RemoteCertificateNameMismatchHTTPS-interceptie door corporate of beheerde proxyInstalleer/vertrouw de proxy-CA waar passend; gebruik custom validation alleen in gecontroleerde dev- of goedgekeurde MITM-scenario’s
302 Redirect loopCaptive portal of allowlist-blokkade van een bedrijfsproxy/VPN die blijft omleidenTest een directe verbinding; inspecteer Location-headers; controleer allowlist en authenticatieportal van de proxy
HttpRequestException / Geen verbinding met SOCKS-URLSOCKS-code draaien op .NET Framework of oudere .NET; verkeerd schema of verkeerde poortGebruik .NET 6+ voor native SOCKS-ondersteuning; controleer socks5://host:port; test met documentatie van de provider
Proxy lijkt genegeerd te wordenUseProxy = false; target wordt als lokaal overgeslagen; NO_PROXY-omgevingsvariabele; handler anders geconfigureerd dan verwachtZet UseProxy = true; inspecteer HttpClient.DefaultProxy; wis of overschrijf omgevingsvariabelen; zet BypassProxyOnLocal = false

Snelle debugflow

  1. Is het request gelukt? → Ja: vergelijk de output van api.ipify.org met het verwachte proxy-IP.
  2. Nee, er is een HTTP-statuscode? → 407: los proxycredentials op. 403/429: de target blokkeert of rate-limited de proxy. 3xx-loop: de proxy of corporate gateway kan aan het omleiden zijn.
  3. Geen statuscode, alleen een exception? → Timeout: test de bereikbaarheid van de proxy. Socket- of certificaat-exception: controleer pooling, protocol, TLS en de .NET-versie.

Handige eerste commando’s om de proxy zelf buiten .NET te valideren:

curl -x http://user:pass@proxy.example.com:8080 https://api.ipify.org/
curl --socks5 user:pass@proxy.example.com:1080 https://api.ipify.org/

Als curl werkt maar je C#-code niet, zit het verschil meestal in het auth-schema, de TLS trust store, omgevingsvariabelen of het escapen van credentials. Laat curl’s proxy-URL, schema en authenticatie exact overeenkomen en zet de credentials daarna om naar NetworkCredential.

Wanneer proxybeheer overslaan: het no-code alternatief

Een flink deel van de developers die zoeken op “HttpClient proxy C#” wil niet per se proxytheorie leren — ze willen gewoon een scraper draaien. Het is de moeite waard om eerlijk te zijn over wanneer custom C# proxycode het juiste gereedschap is en wanneer niet.

Bouw een custom C# scraper met proxy-rotatie wanneer:

  • Je volledige controle nodig hebt over requestlogica, cookies, headers, retries en parsing
  • De scraper moet integreren in een bestaande .NET-codebase of interne service
  • Compliance- of security-eisen vereisen dat je de infrastructuur end-to-end zelf beheert

Gebruik een no-code tool zoals Thunderbit wanneer:

  • Het doel gestructureerde data-extractie van websites is, niet HTTP-infrastructuur
  • Je liever geen proxy pools onderhoudt, CAPTCHAs afhandelt of socket exhaustion debugt
  • Het team data nodig heeft in Excel, Google Sheets, Airtable of Notion zonder parsingcode te schrijven

De Chrome-extensie van Thunderbit regelt proxy-rotatie en anti-botmaatregelen automatisch via de cloud scraping-optie. Met de API kunnen developers een JSON-schema definiëren en gestructureerde data terugkrijgen zonder HttpClient of WebProxy te hoeven beheren. Voor teams die webscraping voor prijsvergelijking of leadextractie doen, is het verschil in opstarttijd aanzienlijk.

ScenarioCustom C# + ProxyThunderbit
Volledige controle over requestlogicaJaNee (alleen API-niveau controle)
Proxybeheer vereistJaNee (automatisch geregeld)
Anti-bot / CAPTCHA-afhandelingHandmatig of via derde partijIngebouwd
Setup-tijdUren tot dagenMinuten
Beste voorBestaande .NET-codebases, custom pipelinesSnelle data-extractie, niet-technische teams, spreadsheet-export

Dit is geen pleidooi om HttpClient nooit te gebruiken. Als je een productie-.NET-service bouwt, moet je proxyconfiguratie absoluut begrijpen. Maar als je uren kwijt bent aan het debuggen van 407-fouten voor een eenmalige datacollectieklus, zijn er simpelere opties — en daar is niets mis mee. Je kunt de prijzen van Thunderbit bekijken of het YouTube-kanaal raadplegen voor walkthroughs.

Belangrijkste inzichten

Het kernpatroon blijft hetzelfde: WebProxy → handler → HttpClient. Alles daarna draait om het vermijden van operationele fouten die in productie opduiken.

  • Credentials horen op de proxy, niet op de handler. Het snippet naast elkaar in het 407-gedeelte is het belangrijkste om te onthouden.
  • Maak niet per request of per proxy een nieuwe HttpClient. Gebruik IHttpClientFactory voor named clients, SocketsHttpHandler met PooledConnectionLifetime voor roterende gateways, of een custom routing handler voor geavanceerde scenario’s.
  • Controleer je .NET-versie voordat je SOCKS5- of SocketsHttpHandler-code kopieert. De compatibiliteitsmatrix hierboven voorkomt stille fouten.
  • Test de proxy eerst buiten .NET. Een snel curl-commando haalt al een hele categorie debugging weg.
  • Voor gestructureerde data-extractie zonder proxygedoe regelen tools zoals Thunderbit de transportlaag, zodat jij je kunt richten op de data zelf.

De volgende keer dat je tegen een 407 of een TaskCanceledException aanloopt, begin dan met de troubleshooting-tabel hierboven.

FAQ's

Kan ik de proxy op een bestaande HttpClient-instantie wijzigen?

Nee. De proxy is gekoppeld aan de handler, en de handler wordt ingesteld bij het aanmaken. HttpClient heeft geen mutabele Proxy-property. Voor verschillende proxies maak je aparte handlers en clients aan, en beheer je die met IHttpClientFactory named clients of een pool van vooraf geconfigureerde clients.

Gebruikt HttpClient standaard de systeemproxy?

Ja. In moderne .NET erft HttpClient de standaard proxy-instellingen van het systeem als je niet expliciet een handler instelt — inclusief omgevingsvariabelen zoals HTTPS_PROXY en HTTP_PROXY via HttpClient.DefaultProxy. Om dit uit te schakelen, zet je expliciet UseProxy = false op de handler.

Hoe gebruik ik een SOCKS5-proxy met HttpClient in C#?

Gebruik new WebProxy("socks5://host:port") met SocketsHttpHandler. Native SOCKS-ondersteuning vereist .NET 6 of later. Op .NET Framework 4.x wordt SOCKS5 niet native ondersteund — daarvoor heb je een third-party library nodig.

Waarom krijg ik steeds 407 Proxy Authentication Required?

Waarschijnlijk zet je credentials op handler.Credentials (voor de doelserver) in plaats van op handler.Proxy.Credentials (voor de proxy). Zie hierboven het gedeelte “Proxy-credentials versus server-credentials” voor het juiste patroon.

Is het veilig om SSL-certificaatvalidatie uit te schakelen wanneer ik een proxy gebruik?

Alleen in lokale ontwikkeling of wanneer je de proxyprovider volledig vertrouwt (bijvoorbeeld een beheerde scraping-API in HTTPS-proxymodus). In productie met standaard CONNECT- of SOCKS-proxies moet SSL-validatie aan blijven om man-in-the-middle-aanvallen te voorkomen.

Probeer Thunderbit voor moeiteloos webscrapen Get Started Free

Meer lezen

Fawad Khan
Fawad Khan
Fawad schrijft voor zijn werk en eerlijk gezegd vindt hij dat best leuk. Hij heeft jaren besteed aan het uitzoeken wat een tekst laat hangen — en wat lezers juist laat doorscrollen. Vraag hem naar marketing en hij kan er uren over praten. Vraag hem naar carbonara en hij doet er nog een schep bovenop.
Topics
Webscraping-toolsAI Webscraper
Inhoudsopgave

Vraag het en scrape een webpagina

Zeg gewoon in gewone taal wat je nodig hebt. Of nog beter: zeg helemaal niets.

Probeer Thunderbit gratis
Data extraheren met AI
Gegevens eenvoudig overzetten naar Google Sheets, Airtable of Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week