using var handler = new HttpClientHandler
{
    UseProxy = true,
    Proxy = new WebProxy("http://proxy.example:8080")
};
using var client = new HttpClient(handler);

string html = await client.GetStringAsync(
    "https://www.example.com/catalog");
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

This modern .NET fragment uses System.Net and System.Net.Http. The configured client owns network routing, and Html Agility Pack receives the returned HTML string. Retain an appropriately configured client for ongoing work rather than rebuilding its pools for every page.

For this public-page example, an unauthenticated candidate from the HTTP proxy list can replace the intermediary. Replace the destination separately. The website URL retains its TLS identity. Authenticated proxy credentials belong on WebProxy; neither website credentials nor disabled verification substitute for them.

GetStringAsync treats non-success HTTP statuses as errors. Do not convert a failed download into an empty HtmlDocument. If the application needs headers, status detail or an error body, use a response-oriented HTTP operation and inspect it before parsing.

The string method avoids an unconditional extra UTF-8 conversion of raw bytes. If fetching bytes deliberately, carry the response/document encoding requirements into decoding.

LoadHtml produces a parsed document; it does not execute scripts, load styles or follow links. Resolve subsequent relative links against the response's location, and remember that browser-rendered elements may be absent from downloaded source. Each response should produce its own document even when requests share the configured HTTP client.

Erthyglow kevrennek