Вариантов много.
Например можно взять библиотеку
Flurl.Http
using Flurl.Http;
var url = "ссылка";
var dir = "путь для сохранения";
await url.DownloadFileAsync(dir);
Или взять
HttpWebRequest, как советует
Hemul GM (не советую этот вариант, тк он устарел)
using System.IO;
using System.Net;
var url = "ссылка";
var dir = "путь для сохранения";
var req = HttpWebRequest.Create(url);
using var response = req.GetResponse();
using var file = File.OpenWrite(dir + "/fileName.png");
using var stream = response.GetResponseStream();
stream.CopyTo(file);
Вместо него лучше взять
HttpClient:
using System.IO;
using System.Net.Http;
var url = "ссылка";
var dir = "путь для сохранения";
using var httpClient = new HttpClient();
using var stream = await httpClient.GetStreamAsync(url);
using var file = File.OpenWrite(dir + "/fileName.png");
await stream.CopyToAsync(file);
Или использовать устаревший
WebClient, который хоть и устарел (по тому я тоже не рекомендую его), зато из коробки имеет метод для скачивания файлов:
using System.Net;
var url = "ссылка";
var dir = "путь для сохранения";
using var client = new WebClient();
client.DownloadFile(url, dir + "/filename.png");