Panduan5 menit baca

Proxy di C# .NET: HttpClient, SOCKS5, dan sesi sticky

Cara pasang proxy residential di C# .NET: HttpClient dengan WebProxy, rotating vs sticky session, SOCKS5, IHttpClientFactory, RestSharp, dan atasi 407.

Di C# kamu tidak butuh library tambahan untuk memakai proxy: HttpClient bawaan .NET sudah bisa lewat proxy HTTP, HTTPS, maupun SOCKS5 lengkap dengan login. Kuncinya ada di handler: buat SocketsHttpHandler, isi Proxy dengan WebProxy plus NetworkCredential, lalu oper handler itu ke HttpClient. Panduan ini membahas setup dasar, cara mendapat IP baru tiap request, sesi sticky per pekerjaan, SOCKS5, pemakaian di ASP.NET Core, RestSharp, dan error yang paling sering muncul.

Semua contoh memakai endpoint WaroengProxy proxy.waroengproxy.com:8000. Ganti USERNAME dan PASSWORD dengan milikmu dari dashboard; targeting seperti negara atau sesi ditulis di bagian username, jadi host, port, dan password tidak pernah berubah.

Setup dasar: HttpClient lewat proxy

Contoh di bawah mengirim satu request lewat IP Indonesia (-cc-ID) dan mencetak IP yang terlihat oleh situs tujuan. Jalankan di proyek console .NET 6 atau lebih baru (dotnet new console).

Contoh
using System.Net;
var handler = new SocketsHttpHandler
{
Proxy = new WebProxy("http://proxy.waroengproxy.com:8000")
{
Credentials = new NetworkCredential("USERNAME-cc-ID", "PASSWORD")
},
UseProxy = true,
AutomaticDecompression = DecompressionMethods.All
};
using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
var ip = await client.GetStringAsync("https://api.ipify.org");
Console.WriteLine(ip);

Beberapa hal yang perlu diperhatikan dari contoh itu:

  • Alamat proxy ditulis dengan skema http:// walaupun situs tujuannya https://. Untuk situs HTTPS, .NET membuka terowongan CONNECT ke proxy, lalu TLS tetap berjalan ujung ke ujung antara aplikasimu dan situs tujuan.
  • Username dan password masuk lewat NetworkCredential, bukan ditempel di URL proxy. Cara ini lebih aman dari salah escape karakter khusus.
  • AutomaticDecompression membuat .NET meminta respons terkompresi (gzip, deflate, brotli), jadi data yang lewat proxy lebih kecil dan kuota lebih awet.
  • Buat satu HttpClient lalu pakai ulang. Membuat client baru di setiap request membuang koneksi dan memperlambat program.

Rotating: IP baru di setiap request

Tanpa parameter sesi, setiap koneksi baru ke proxy mendapat IP acak dari pool. Masalahnya, HttpClient menyimpan koneksi di pool dan memakainya lagi, jadi beberapa request berturut-turut ke situs yang sama bisa keluar dari IP yang sama karena masih lewat terowongan yang sama. Kalau kamu memang butuh IP berbeda di setiap request, minta koneksi ditutup setelah respons:

Contoh
for (var i = 0; i < 3; i++)
{
using var req = new HttpRequestMessage(HttpMethod.Get, "https://api.ipify.org");
req.Headers.ConnectionClose = true; // close the tunnel, next request gets a fresh one
using var res = await client.SendAsync(req);
Console.WriteLine(await res.Content.ReadAsStringAsync());
}

Dengan ConnectionClose, request berikutnya membuka terowongan baru dan mendapat IP baru. Konsekuensinya ada sedikit tambahan waktu untuk handshake TLS setiap request. Kalau rotasi per request tidak wajib, biarkan pooling bekerja normal. Penjelasan kapan rotating lebih cocok ada di artikel sticky atau rotating.

Sticky session: satu IP untuk satu pekerjaan

Untuk alur yang butuh IP tetap, misalnya login lalu membuka beberapa halaman, tambahkan -s-<label> dan -ttl-<detik> di username. Label yang sama mendapat IP yang sama selama TTL berlaku (1 sampai 86400 detik, bawaan 60). Karena kredensial melekat pada handler, cara paling rapi adalah satu HttpClient per sesi:

Contoh
static HttpClient ClientForSession(string sessionId, int ttl = 600)
{
// sessionId: letters and digits only, "-" is the username separator
var user = $"USERNAME-cc-ID-s-{sessionId}-ttl-{ttl}";
var handler = new SocketsHttpHandler
{
Proxy = new WebProxy("http://proxy.waroengproxy.com:8000")
{
Credentials = new NetworkCredential(user, "PASSWORD")
},
UseProxy = true,
AutomaticDecompression = DecompressionMethods.All
};
return new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
}
using var job42 = ClientForSession("job42");
Console.WriteLine(await job42.GetStringAsync("https://api.ipify.org"));
Console.WriteLine(await job42.GetStringAsync("https://api.ipify.org")); // same IP
  1. Pakai label yang hanya berisi huruf dan angka, misalnya job42 atau toko7. Tanda minus dipakai sebagai pemisah parameter di username.
  2. Pilih TTL sedikit lebih panjang dari durasi pekerjaanmu. Kalau TTL habis, label yang sama bisa mendapat IP lain.
  3. Simpan client per label di Dictionary<string, HttpClient> kalau kamu menjalankan banyak sesi paralel, lalu Dispose saat pekerjaannya selesai.
  4. Butuh IP baru untuk sesi yang sama? Ganti labelnya, misalnya dari job42 ke job42b.

SOCKS5 di .NET

Sejak .NET 6, WebProxy menerima skema socks5://, termasuk login username/password. Endpoint WaroengProxy sama untuk semua protokol, jadi cukup ganti skemanya:

Contoh
var handler = new SocketsHttpHandler
{
Proxy = new WebProxy("socks5://proxy.waroengproxy.com:8000")
{
Credentials = new NetworkCredential("USERNAME-cc-ID", "PASSWORD")
},
UseProxy = true
};

Untuk request HTTP dan HTTPS biasa, proxy HTTP sudah cukup dan biasanya paling mudah di-debug. SOCKS5 berguna kalau library yang kamu pakai hanya mendukung SOCKS atau kamu ingin perilaku yang sama dengan tool lain. Perbandingan lengkapnya ada di HTTP, HTTPS, atau SOCKS5.

ASP.NET Core: IHttpClientFactory

Di aplikasi ASP.NET Core atau worker service, jangan membuat HttpClient manual di setiap kelas. Daftarkan named client sekali di Program.cs, lalu ambil lewat IHttpClientFactory:

Contoh
builder.Services.AddHttpClient("proxy-id", c => c.Timeout = TimeSpan.FromSeconds(30))
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
{
Proxy = new WebProxy("http://proxy.waroengproxy.com:8000")
{
Credentials = new NetworkCredential("USERNAME-cc-ID", "PASSWORD")
},
UseProxy = true,
AutomaticDecompression = DecompressionMethods.All
});
// in a service: var client = httpClientFactory.CreateClient("proxy-id");

Factory mengatur umur handler untukmu, jadi aman dipakai lama. Kalau butuh beberapa negara, daftarkan beberapa named client, misalnya proxy-id dengan -cc-ID dan proxy-sg dengan -cc-SG.

RestSharp dan library lain

Sebagian besar library HTTP di .NET dibangun di atas HttpClient, jadi polanya sama: cari properti Proxy bertipe IWebProxy. Di RestSharp versi baru, proxy diisi lewat RestClientOptions:

Contoh
var options = new RestClientOptions("https://api.ipify.org")
{
Proxy = new WebProxy("http://proxy.waroengproxy.com:8000")
{
Credentials = new NetworkCredential("USERNAME-cc-ID", "PASSWORD")
}
};
var rest = new RestClient(options);

Untuk tool kecil atau skrip sekali jalan, kamu juga bisa mengandalkan variabel lingkungan HTTPS_PROXY dan HTTP_PROXY yang dibaca HttpClient bawaan. Formatnya http://USERNAME-cc-ID:PASSWORD@proxy.waroengproxy.com:8000. Untuk aplikasi yang berjalan lama, setup di kode lebih mudah dilacak.

Error yang sering muncul

  • 407 Proxy Authentication Required: username atau password salah, atau Credentials belum diisi. Salin ulang dari generator dan pastikan tidak ada spasi di ujung.
  • `TaskCanceledException` setelah 30 detik: itu batas Timeout client, bukan selalu salah proxy. Cek apakah situs tujuan memang lambat, lalu naikkan timeout atau tambahkan retry dengan jeda.
  • IP terlihat dari negara lain: periksa kode negara di username (-cc-ID, huruf besar dua karakter) dan pastikan kamu tidak memakai client lama yang masih memegang koneksi sebelumnya.
  • IP tidak berganti padahal rotating: koneksi masih dipakai ulang oleh pool. Pakai ConnectionClose seperti contoh di atas.

Daftar penyebab yang lebih panjang ada di cara mengatasi error proxy.

Mulai dengan satu request ke https://api.ipify.org untuk memastikan IP dan negaranya benar sebelum menjalankan pekerjaan besar. Kalau kamu mengambil data dari situs lain, patuhi ToS dan robots.txt situs itu, beri jeda antar-request, dan unduh hanya halaman yang benar-benar kamu butuhkan.

Penutup

Ringkasnya: SocketsHttpHandler + WebProxy + NetworkCredential untuk setup, ConnectionClose untuk IP baru per request, satu client per label untuk sesi sticky, dan IHttpClientFactory untuk aplikasi ASP.NET Core. Kamu bayar per GB yang terpakai tanpa langganan, mulai 1 GB lewat top-up QRIS. Cek harga, baca dokumentasi untuk semua parameter username, atau daftar dan coba contoh di atas hari ini. Pakai bahasa lain juga? Lihat panduan proxy di Go.