Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
C# HttpClient proxy: Cấu hình WebProxy, SOCKS5 và xác thực

C# HttpClient proxy: Cấu hình WebProxy, SOCKS5 và xác thực

Chuyên viên Kỹ thuật ProxyVN 04-18-2026 Đang tính... phút đọc

C# HttpClient proxy là cách cấu hình ứng dụng .NET gửi yêu cầu HTTP qua máy chủ trung gian thay vì kết nối thẳng từ IP của máy đang chạy chương trình. Lập trình viên cần nó khi ứng dụng chạy sau proxy công ty, khi thu thập dữ liệu qua nhiều IP hay khi đối tác chỉ cho phép một IP cố định gọi API. Gợi ý tìm kiếm có cả "socks5", "authentication", "environment variable". ProxyVN hướng dẫn từng cách với mã chạy được.

Tổng quan về C# HttpClient proxy

Trong .NET, HttpClient không tự mở kết nối. Nó giao việc đó cho một handler, thường là HttpClientHandler hoặc SocketsHttpHandler. Proxy được cấu hình trên handler, không phải trên HttpClient. Hiểu quan hệ này là chìa khoá để cấu hình C# HttpClient proxy đúng.

HttpClient, Handler và Proxy

HttpClient, Handler và Proxy

Ba lớp cần biết

  • HttpClient: lớp gửi yêu cầu, theo tài liệu HttpClient của Microsoft, nên được tạo một lần và dùng lại.
  • Handler: HttpClientHandler là lớp quen thuộc, SocketsHttpHandler là lớp nền mạnh hơn trên .NET hiện đại.
  • IWebProxy: đối tượng mô tả proxy, thường dùng lớp WebProxy.

Thuộc tính Proxy và UseProxy

Theo tài liệu HttpClientHandler.Proxy, thuộc tính Proxy nhận một IWebProxy. Thuộc tính UseProxy quyết định có dùng proxy hay không. Khi Proxy để trống và UseProxy bằng true, handler dùng proxy mặc định của hệ thống hoặc biến môi trường.

Proxy mặc định toàn cục

HttpClient có thuộc tính tĩnh DefaultProxy. Theo tài liệu HttpClient.DefaultProxy, đây là proxy dùng cho mọi handler không tự đặt proxy riêng. Thay đổi DefaultProxy ảnh hưởng toàn ứng dụng, nên chỉ dùng khi cả ứng dụng đi qua một proxy.

Cấu hình C# HttpClient proxy HTTP cơ bản

Cách phổ biến nhất là tạo WebProxy, gán cho HttpClientHandler rồi tạo HttpClient từ handler đó.

WebProxy kèm NetworkCredential

WebProxy kèm NetworkCredential

Mã mẫu không xác thực

using System.Net;
 
var proxy = new WebProxy("http://103.x.x.11:8080")
{
    BypassProxyOnLocal = true
};
var handler = new HttpClientHandler
{
    Proxy = proxy,
    UseProxy = true
};
using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(20) };
 
var ip = await client.GetStringAsync("https://api.ipify.org");
Console.WriteLine($"IP: {ip}");

BypassProxyOnLocal bằng true giúp địa chỉ cục bộ đi thẳng không qua proxy. Lớp WebProxy còn có BypassList để khai báo danh sách mẫu địa chỉ bỏ qua proxy.

Mã mẫu có xác thực

Proxy thương mại thường có tài khoản và mật khẩu. Gán NetworkCredential cho thuộc tính Credentials của WebProxy:

using System.Net;
 
var proxy = new WebProxy("http://103.x.x.11:8080")
{
    Credentials = new NetworkCredential("user01", "matkhau01")
};
var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
using var client = new HttpClient(handler);
 
var resp = await client.GetAsync("https://api.ipify.org");
Console.WriteLine($"{(int)resp.StatusCode} {await resp.Content.ReadAsStringAsync()}");

Không ghi tài khoản vào chuỗi địa chỉ kiểu http://user:pass@host. Dùng NetworkCredential để .NET tự xử lý bước xác thực với proxy.

Xác thực Windows với proxy công ty

Với proxy công ty dùng xác thực NTLM hoặc Kerberos, có thể dùng thông tin đăng nhập Windows hiện tại:

var proxy = new WebProxy("http://proxy.congty.vn:8080")
{
    UseDefaultCredentials = true
};

Ứng dụng sẽ dùng tài khoản Windows đang đăng nhập để xác thực với proxy. Cách này phổ biến trong ứng dụng nội bộ doanh nghiệp.

Cấu hình C# HttpClient proxy SOCKS5

Từ .NET 6, SocketsHttpHandler hỗ trợ proxy SOCKS. Chỉ cần dùng scheme socks5 trong địa chỉ WebProxy.

SOCKS5 với SocketsHttpHandler

SOCKS5 với SocketsHttpHandler

Mã mẫu SOCKS5 với SocketsHttpHandler

using System.Net;
 
var handler = new SocketsHttpHandler
{
    Proxy = new WebProxy("socks5://103.x.x.11:1080")
    {
        Credentials = new NetworkCredential("user01", "matkhau01")
    },
    UseProxy = true,
    PooledConnectionLifetime = TimeSpan.FromMinutes(5)
};
using var client = new HttpClient(handler);
Console.WriteLine(await client.GetStringAsync("https://api.ipify.org"));

Tài liệu SocketsHttpHandler mô tả các thuộc tính kết nối như PooledConnectionLifetime. Các scheme SOCKS được hỗ trợ gồm socks4, socks4a và socks5.

Lưu ý phiên bản .NET

Hỗ trợ SOCKS có từ .NET 6. Với .NET Framework cũ, HttpClient không hỗ trợ SOCKS sẵn, cần thư viện ngoài hoặc chuyển sang proxy HTTP. Nếu dự án còn chạy .NET Framework 4.x, dùng cổng HTTP của proxy là cách đơn giản nhất.

Chọn HTTP hay SOCKS5 cho .NET

Với yêu cầu web thông thường, HTTP dễ gỡ lỗi hơn và tương thích mọi phiên bản .NET. SOCKS5 hợp khi cần chuyển lưu lượng không phải HTTP hoặc khi nhà cung cấp chỉ cấp SOCKS5. Bài proxy HTTP và SOCKS5 khác nhau thế nào phân tích kỹ.

Cấu hình C# HttpClient proxy bằng biến môi trường

Trên .NET hiện đại, khi không đặt proxy riêng, HttpClient đọc biến môi trường để xác định proxy mặc định. Đây là cách hợp với container và máy chủ.

Các biến được đọc

  • HTTP_PROXY: proxy cho yêu cầu http.
  • HTTPS_PROXY: proxy cho yêu cầu https.
  • ALL_PROXY: proxy dùng cho cả hai nếu không có biến riêng.
  • NO_PROXY: danh sách máy chủ không đi qua proxy.

Ví dụ đặt biến trên Windows

$env:HTTPS_PROXY = "http://user01:matkhau01@103.x.x.11:8080"
$env:NO_PROXY = "localhost,127.0.0.1,.congty.vn"
dotnet run

Mã không cần thay đổi, chỉ dùng HttpClient thường. Cách này giúp cùng một ứng dụng chạy được ở nhiều môi trường với proxy khác nhau. Cú pháp NO_PROXY được giải thích trong bài no_proxy là gì.

Thứ tự ưu tiên

Proxy đặt trực tiếp trên handler được ưu tiên hơn DefaultProxy. DefaultProxy lại được xác định từ biến môi trường hoặc cấu hình hệ thống. Khi proxy không như mong đợi, kiểm tra theo thứ tự này.

C# HttpClient proxy với IHttpClientFactory

Trong ứng dụng ASP.NET Core hay dịch vụ chạy nền, nên dùng IHttpClientFactory thay vì tự tạo HttpClient. Factory quản lý vòng đời handler, tránh cạn cổng và cập nhật DNS đúng cách.

IHttpClientFactory nhiều proxy

IHttpClientFactory nhiều proxy

Đăng ký client có proxy

builder.Services.AddHttpClient("proxy-vn")
    .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
    {
        Proxy = new WebProxy("http://103.x.x.11:8080")
        {
            Credentials = new NetworkCredential(
                builder.Configuration["Proxy:User"],
                builder.Configuration["Proxy:Pass"])
        },
        UseProxy = true,
        PooledConnectionLifetime = TimeSpan.FromMinutes(5)
    });

Thông tin proxy đọc từ cấu hình, không ghi cứng trong mã. Hướng dẫn chi tiết về factory có trong tài liệu IHttpClientFactory.

Dùng client đã đăng ký

public class GiaService(IHttpClientFactory factory)
{
    public async Task<string> LayIpAsync()
    {
        var client = factory.CreateClient("proxy-vn");
        return await client.GetStringAsync("https://api.ipify.org");
    }
}

Nhiều client, nhiều proxy

Đăng ký nhiều client có tên, mỗi client một proxy, ví dụ "proxy-viettel", "proxy-vnpt". Dịch vụ chọn client theo nhu cầu. Cách này tách rõ cấu hình và giúp đổi proxy mà không sửa logic nghiệp vụ.

Xoay C# HttpClient proxy

Proxy gán trên handler cố định cho mọi yêu cầu qua handler đó. Muốn xoay proxy, có hai hướng.

Hướng 1: Nhiều handler, chọn theo lượt

Tạo sẵn danh sách HttpClient, mỗi client một proxy, chọn lần lượt cho từng yêu cầu:

var proxies = new[] { "http://103.x.x.11:8080", "http://103.x.x.12:8080", "http://103.x.x.13:8080" };
var clients = proxies.Select(p => new HttpClient(new SocketsHttpHandler
{
    Proxy = new WebProxy(p) { Credentials = new NetworkCredential("user01", "matkhau01") },
    UseProxy = true
}) { Timeout = TimeSpan.FromSeconds(20) }).ToArray();
 
int dem = 0;
HttpClient Chon() => clients[Interlocked.Increment(ref dem) % clients.Length];

Interlocked giúp an toàn khi nhiều luồng cùng gọi. Mỗi client giữ kết nối riêng tới proxy của nó.

Hướng 2: IWebProxy tuỳ chỉnh

Viết lớp cài đặt IWebProxy, trong phương thức GetProxy trả về proxy khác nhau. Cần cẩn thận vì handler giữ kết nối theo proxy, kết nối cũ có thể được dùng lại. Với nhu cầu xoay đơn giản, hướng 1 dễ kiểm soát hơn.

Proxy xoay một cổng

Nếu nhà cung cấp có proxy xoay với một cổng cố định, chỉ cần một WebProxy. IP phía sau tự đổi theo chu kỳ hoặc theo lệnh. Bài proxy pool là gì bàn cách chia proxy theo công việc.

Xử lý lỗi và thử lại với C# HttpClient proxy

Lỗi thường gặp

Bảng: Lỗi thường gặp

Lỗi

Nguyên nhân khả dĩ

Cách xử lý

407 Proxy Authentication Required

Sai tài khoản hoặc chưa gán Credentials

Gán NetworkCredential cho WebProxy

HttpRequestException kết nối bị từ chối

Sai địa chỉ, cổng hoặc proxy chết

Kiểm tra proxy bằng curl

TaskCanceledException

Hết thời gian chờ

Tăng Timeout hợp lý, đổi proxy

NotSupportedException với socks5

.NET cũ không hỗ trợ SOCKS

Nâng .NET 6+ hoặc dùng HTTP

IP vẫn là IP thật

Handler không gán Proxy hoặc UseProxy false

Kiểm tra cấu hình handler

Lỗi chứng chỉ SSL

Proxy công ty can thiệp HTTPS

Cài chứng chỉ công ty vào hệ thống

Lỗi 407 nói chung được giải thích trong bài sửa lỗi 407 proxy authentication required.

Thử lại với độ trễ tăng dần trong C#

async Task<string?> LayVoiThuLai(Func<HttpClient> chon, string url, int lan = 3)
{
    for (int i = 0; i < lan; i++)
    {
        try
        {
            var r = await chon().GetAsync(url);
            if ((int)r.StatusCode == 429 || (int)r.StatusCode >= 500)
            {
                await Task.Delay(TimeSpan.FromSeconds(i + 1));
                continue;
            }
            return await r.Content.ReadAsStringAsync();
        }
        catch (HttpRequestException)
        {
            await Task.Delay(TimeSpan.FromSeconds(i + 1));
        }
    }
    return null;
}

Với dự án lớn, thư viện như Polly cung cấp chính sách thử lại, ngắt mạch đầy đủ hơn. Mã 429 cho biết cần chậm lại, xem thêm bài mua proxy bị lỗi 429.

Đặt timeout đúng chỗ

HttpClient.Timeout giới hạn tổng thời gian yêu cầu. SocketsHttpHandler có ConnectTimeout cho riêng bước kết nối. Đặt cả hai giúp phát hiện nhanh proxy không phản hồi.

Kiểm tra C# HttpClient proxy hoạt động đúng

Kiểm tra IP ứng dụng .NET đang dùng

Gọi dịch vụ trả IP như api.ipify.org. IP trả về phải là IP proxy.

So sánh kết quả .NET với curl

curl -x http://user01:matkhau01@103.x.x.11:8080 https://api.ipify.org

Curl chạy mà .NET lỗi thì vấn đề ở mã. Cả hai lỗi thì vấn đề ở proxy. Bài cURL proxy là gì có cách đọc lỗi chi tiết.

Bật nhật ký mạng

.NET có cơ chế theo dõi sự kiện mạng qua EventSource. Bật nhật ký cho System.Net.Http khi gỡ lỗi để thấy kết nối tới proxy, mã trả về và thời gian từng bước.

Bảo mật khi dùng C# HttpClient proxy

Không ghi mật khẩu vào mã

Đọc tài khoản proxy từ cấu hình, biến môi trường hoặc kho bí mật như User Secrets khi phát triển, dịch vụ quản lý bí mật khi chạy thật. Không đưa appsettings.json có mật khẩu lên kho mã.

Không trả true trong ServerCertificateCustomValidationCallback

ServerCertificateCustomValidationCallback trả về true làm ứng dụng tin mọi chứng chỉ. Chỉ dùng trong môi trường thử nghiệm cô lập. Với proxy công ty, cài chứng chỉ gốc vào kho tin cậy của hệ điều hành.

Chọn proxy rõ nguồn cho ứng dụng .NET

Proxy miễn phí có thể ghi lại token API trong header. Với dịch vụ quan trọng, dùng proxy từ nhà cung cấp có hỗ trợ và chính sách rõ ràng. Bài free proxy có an toàn không phân tích các rủi ro.

Chọn proxy cho ứng dụng .NET

Gọi API đối tác yêu cầu IP cố định

Dùng proxy tĩnh riêng, đăng ký IP với đối tác. Ứng dụng chạy ở đâu cũng ra Internet bằng IP đó. Anh em có thể mua proxy tĩnh tại ProxyVN với cả HTTP và SOCKS5.

Ứng dụng .NET thu thập dữ liệu công khai

Dùng danh sách proxy dân cư hoặc proxy xoay, kết hợp giới hạn tốc độ và thử lại.

Ứng dụng nội bộ sau proxy công ty

Dùng UseDefaultCredentials với proxy công ty, hoặc biến môi trường do bộ phận IT cung cấp.

Cơ chế xác thực của C# HttpClient proxy

Hiểu cách .NET xác thực với proxy giúp anh em đọc đúng lỗi 407 và tránh những lần gửi yêu cầu thừa. Quá trình diễn ra theo kiểu thử thách và trả lời, giống xác thực HTTP thông thường.

Bước thử thách 407

Lần đầu gửi yêu cầu, handler có thể gửi không kèm thông tin xác thực. Proxy trả 407 kèm header Proxy-Authenticate cho biết kiểu xác thực chấp nhận như Basic, Digest, NTLM hay Negotiate. Handler đọc header này, lấy thông tin từ Credentials của WebProxy và gửi lại yêu cầu kèm header Proxy-Authorization. Nếu thông tin đúng, proxy cho đi tiếp.

Vì sao vẫn thấy 407 dù đã gán Credentials

Có vài lý do phổ biến. Kiểu xác thực proxy yêu cầu không khớp với kiểu thông tin anh em cung cấp, ví dụ proxy chỉ nhận NTLM nhưng tài khoản không thuộc miền. Mật khẩu có ký tự bị gõ nhầm. Hoặc proxy dùng xác thực theo IP whitelist và không chấp nhận tài khoản. Đọc kỹ header Proxy-Authenticate trong nhật ký để biết proxy yêu cầu kiểu nào.

Dùng CredentialCache cho nhiều kiểu xác thực

Khi cần chỉ định kiểu xác thực cụ thể, CredentialCache cho phép gắn thông tin đăng nhập theo địa chỉ và kiểu xác thực. Cách này hữu ích trong môi trường doanh nghiệp có nhiều proxy với cơ chế khác nhau. Với proxy thương mại thông thường, NetworkCredential đơn giản là đủ.

C# HttpClient proxy trên Linux và Docker

Ứng dụng .NET ngày càng chạy nhiều trên Linux và container. Cấu hình proxy ở môi trường này có vài điểm khác Windows.

Không có proxy hệ thống kiểu Windows

Trên Linux, không có giao diện cài đặt proxy dùng chung như Windows. .NET dựa vào biến môi trường để xác định proxy mặc định. Nếu ứng dụng chạy tốt trên máy Windows của lập trình viên nhưng lỗi trên máy chủ Linux, nhiều khả năng máy chủ thiếu biến HTTPS_PROXY hoặc NO_PROXY.

Truyền cấu hình vào container

Truyền biến môi trường khi chạy container, hoặc dùng cấu hình ứng dụng đọc từ biến môi trường theo chuẩn ASP.NET Core. Với tài khoản proxy, dùng cơ chế quản lý bí mật của nền tảng thay vì ghi vào tệp cấu hình trong ảnh.

NO_PROXY cho dịch vụ nội bộ của ứng dụng .NET

Ứng dụng trong cụm thường gọi cơ sở dữ liệu, bộ nhớ đệm, dịch vụ khác qua tên nội bộ. Các tên này cần nằm trong NO_PROXY. Thiếu NO_PROXY, yêu cầu nội bộ bị đẩy ra proxy và thất bại, thường biểu hiện bằng lỗi hết thời gian chờ khó hiểu. Cấu hình Docker liên quan có trong bài proxy Docker.

Chứng chỉ trong ảnh container

Nếu proxy công ty can thiệp HTTPS, ảnh container cần có chứng chỉ gốc của công ty trong kho tin cậy. Sao chép chứng chỉ vào ảnh và chạy lệnh cập nhật kho chứng chỉ của bản phân phối Linux đang dùng.

Ví dụ ứng dụng theo dõi giá với C# HttpClient proxy

Để thấy các phần ghép lại thế nào, xét một dịch vụ nền theo dõi giá sản phẩm công khai trên vài website. Đây là mô hình chung, không gắn với website cụ thể.

Kiến trúc

Dịch vụ gồm bốn phần. Một bộ lập lịch kích hoạt mỗi giờ. Một hàng đợi chứa danh sách URL cần kiểm tra. Một nhóm worker lấy URL từ hàng đợi và gửi yêu cầu qua HttpClient có proxy. Một kho dữ liệu lưu giá và thời điểm.

Cấu hình proxy cho worker

Mỗi worker dùng IHttpClientFactory với vài client có tên, mỗi client một proxy. Worker chọn client theo lượt. Thông tin proxy đọc từ cấu hình, có thể thay đổi mà không cần triển khai lại mã.

Giới hạn tốc độ

Dùng SemaphoreSlim giới hạn số yêu cầu đồng thời và độ trễ giữa các yêu cầu tới cùng một website. Lưu lượng đều đặn ít bị chặn hơn lưu lượng dồn dập. Bài proxy theo dõi giá đối thủ bàn chi tiết về bài toán này.

Xử lý khi bị chặn

Khi nhận 403 hoặc 429, worker ghi nhận, tạm dừng proxy đó một thời gian và đưa URL trở lại hàng đợi. Khi một proxy lỗi liên tục, loại khỏi danh sách và báo cho người vận hành. Cơ chế chuyển proxy tự động có trong bài proxy failover.

Kiểm thử mã dùng C# HttpClient proxy

Tách HttpClient khỏi logic

Logic nghiệp vụ nên nhận HttpClient hoặc IHttpClientFactory qua tiêm phụ thuộc. Khi kiểm thử, thay bằng client dùng handler giả trả về phản hồi cố định. Logic được kiểm thử mà không cần mạng hay proxy thật.

Handler giả cho tình huống lỗi

Viết handler kế thừa HttpMessageHandler, trả về 407, 429, 503 hoặc ném ngoại lệ theo kịch bản. Kiểm tra mã thử lại đúng số lần, chọn proxy khác, ghi nhật ký đúng. Kiểm thử tình huống lỗi giúp ứng dụng ổn định hơn khi proxy thật chập chờn.

Kiểm thử tích hợp với proxy thật

Trong môi trường thử nghiệm, chạy vài kiểm thử gọi qua proxy thật để xác nhận cấu hình. Giữ số lượng ít để không tốn băng thông và không làm phiền website đích.

Quy trình đưa C# HttpClient proxy vào dự án

Bước 1: Chọn cách cấu hình

Ứng dụng chạy sau proxy công ty dùng biến môi trường hoặc UseDefaultCredentials. Ứng dụng cần proxy riêng dùng IHttpClientFactory với client có tên.

Bước 2: Tập trung cấu hình

Đưa địa chỉ, tài khoản, danh sách bỏ qua vào một mục cấu hình duy nhất. Mọi client đọc từ đây.

Bước 3: Đo và theo dõi

Ghi số yêu cầu, tỉ lệ lỗi, thời gian phản hồi theo từng proxy. Đặt cảnh báo khi tỉ lệ lỗi vượt ngưỡng. Bài proxy success rate hướng dẫn cách đo.

Bước 4: Rà soát định kỳ

Kiểm tra hạn sử dụng proxy, chi phí và hiệu năng mỗi tháng. Thay proxy kém trước khi ảnh hưởng tới dữ liệu.

Đo hiệu năng C# HttpClient proxy

Trước khi đưa danh sách proxy vào chạy thật, đo hiệu năng giúp chọn proxy tốt và số luồng phù hợp. .NET có đủ công cụ để đo mà không cần thư viện ngoài.

Đo thời gian bằng Stopwatch

Bọc mỗi yêu cầu bằng Stopwatch, ghi lại thời gian hoàn tất. Gửi vài chục yêu cầu qua mỗi proxy để có số liệu đủ tin cậy. Tính trung vị và phân vị 95. Proxy có phân vị 95 cao bất thường là proxy chập chờn, dễ gây hết thời gian chờ.

Tách thời gian kết nối và thời gian phản hồi

Dùng sự kiện chẩn đoán của System.Net.Http hoặc công cụ dotnet-counters để thấy số kết nối đang mở, thời gian chờ trong hàng đợi kết nối. Nếu thời gian chờ kết nối cao, có thể pool kết nối quá nhỏ hoặc proxy giới hạn số kết nối đồng thời.

So sánh hiệu năng .NET với kết nối trực tiếp

Đo cùng website không qua proxy để có mốc. Chênh lệch là phần proxy gây ra. Bài benchmark proxy có quy trình đo tốc độ và độ ổn định chi tiết.

Chọn số luồng

Tăng dần số yêu cầu đồng thời, theo dõi tỉ lệ lỗi và thời gian phản hồi. Khi lỗi bắt đầu tăng, quay về mức trước đó. Bài 1 proxy chạy được bao nhiêu luồng giúp ước tính ban đầu.

Quản lý vòng đời HttpClient khi dùng proxy

Một lỗi kinh điển trong .NET là tạo HttpClient mới cho mỗi yêu cầu. Với proxy, lỗi này càng nặng vì mỗi client mở kết nối mới tới proxy.

Vấn đề cạn cổng

Mỗi HttpClient bị huỷ để lại kết nối ở trạng thái chờ đóng trong một thời gian. Tạo và huỷ hàng nghìn client trong thời gian ngắn làm cạn cổng của máy, gây lỗi kết nối hàng loạt. Proxy cũng có thể từ chối khi nhận quá nhiều kết nối mới.

Giải pháp

Dùng một HttpClient lâu dài cho mỗi proxy, hoặc dùng IHttpClientFactory để factory quản lý handler. Đặt PooledConnectionLifetime để kết nối được làm mới định kỳ, giúp nhận thay đổi DNS và phân phối lại tải.

Khi proxy thay đổi

Nếu cần đổi proxy trong lúc chạy, tạo handler mới với proxy mới, chuyển dần yêu cầu sang client mới, rồi huỷ client cũ khi không còn yêu cầu đang chạy. Không gán lại Proxy cho handler đã dùng.

C# HttpClient proxy trong ứng dụng desktop và công cụ dòng lệnh

Không chỉ dịch vụ máy chủ, ứng dụng desktop WinForms, WPF, MAUI và công cụ dòng lệnh cũng cần proxy khi chạy trong môi trường doanh nghiệp. Cách cấu hình có vài điểm riêng.

Tôn trọng proxy hệ thống của người dùng

Ứng dụng desktop chạy trên máy người dùng nên tôn trọng proxy hệ thống thay vì ép proxy riêng. Để Proxy trống và UseProxy bằng true, HttpClient sẽ dùng cấu hình mặc định của hệ thống. Người dùng sau proxy công ty dùng được ngay mà không cần cấu hình thêm.

Cho phép người dùng nhập proxy riêng

Với công cụ cần proxy riêng, thêm phần cài đặt cho người dùng nhập địa chỉ, cổng, tài khoản. Lưu mật khẩu bằng cơ chế bảo vệ dữ liệu của hệ điều hành, không lưu dạng văn bản thường. Cung cấp nút kiểm tra kết nối để người dùng biết proxy hoạt động trước khi chạy tác vụ.

Tham số dòng lệnh cho công cụ

Công cụ dòng lệnh nên nhận proxy qua tham số hoặc biến môi trường. Ví dụ tham số --proxy với giá trị địa chỉ proxy, kèm tài khoản đọc từ biến môi trường để không lộ trong lịch sử lệnh. Đây là cách nhiều công cụ phổ biến như curl, git đang làm.

Hiển thị lỗi proxy rõ ràng

Khi gặp lỗi 407 hay không kết nối được proxy, hiển thị thông báo dễ hiểu cho người dùng, kèm gợi ý kiểm tra địa chỉ, tài khoản. Thông báo chung chung kiểu "lỗi mạng" khiến người dùng không biết sửa ở đâu.

Câu hỏi thường gặp về C# HttpClient proxy

Nên dùng HttpClientHandler hay SocketsHttpHandler

Trên .NET hiện đại, HttpClientHandler thực chất dùng SocketsHttpHandler bên dưới. Dùng SocketsHttpHandler trực tiếp khi cần thuộc tính như PooledConnectionLifetime, ConnectTimeout.

Có đổi proxy của HttpClient đang dùng được không

Không nên. Handler đã gửi yêu cầu thì không đổi Proxy được nữa. Tạo handler và client mới cho proxy mới, hoặc dùng IHttpClientFactory với nhiều client có tên.

WebClient và HttpWebRequest có dùng được proxy không

Có, nhưng đây là API cũ, Microsoft khuyên dùng HttpClient cho mã mới.

HttpClient có hỗ trợ tệp PAC không

Trên Windows, khi dùng proxy mặc định của hệ thống, .NET có thể áp dụng cấu hình tự động mà hệ điều hành cung cấp. Trên Linux, .NET không tự đọc tệp PAC. Nếu môi trường dùng PAC, hỏi bộ phận IT địa chỉ proxy thật cho các tên miền cần gọi rồi cấu hình trực tiếp.

Dùng proxy cho gRPC trong .NET được không

gRPC trên .NET dùng HttpClient bên dưới, nên cấu hình proxy trên handler cũng áp dụng. Cần lưu ý gRPC dùng HTTP/2, proxy phải hỗ trợ đường hầm CONNECT để luồng HTTP/2 đi qua.

Xem thêm:

Tổng kết

C# HttpClient proxy được cấu hình trên handler: WebProxy kèm NetworkCredential cho HTTP, scheme socks5 với SocketsHttpHandler từ .NET 6, biến môi trường cho container và IHttpClientFactory cho ứng dụng lớn. Nhớ đặt timeout, thử lại hợp lý và bảo vệ mật khẩu. Cần proxy ổn định, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để cấu hình C# HttpClient proxy.

TIN TỨC LIÊN QUAN