C# Web Requests / Copy File / Uri

2022-01-07

筆記如何使用 C# 將檔案從 URL 進行下載,從本機複製至特定路徑以及取得 Http Response Status Code。比較 WebClient 以及 HttpClient 使用上的差異之處。

logo

說明

WebClient

WebClient 平易近人的 API 使用上非常方便,使用 DownloadFile 可以輕鬆的將來源儲存至目標位址,來源支援 HTTP URI 或者是 Local Drive 非常方便。但使用 WebClient 無法取得 Response 的 Http Status Code,此外在 .NET 已經被列為 Deprecated 應該為使用 HttpClient。

public void WebClientSaveFile()
{
    using (var client = new WebClient())
    {
        client.DownloadFile(this.PDFSource, this.StoragePath);
        Console.WriteLine(client.ResponseHeaders);
    }
}

HttpClient

HttpClient 必須要結合 async / await 來使用,並且可以取得 Response 的 Http Status Code。

public async Task HttpClientGetFile()
{
    HttpClient httpclient = new HttpClient();
    HttpResponseMessage response = await httpclient.GetAsync(this.PDFSource);
    using (var fs = new FileStream(this.StoragePath, FileMode.CreateNew))
    {
        await response.Content.CopyToAsync(fs);
        Console.WriteLine($"Status Code: {(int)response.StatusCode}");
    }
}

File.Copy

可以用於指定本機路徑來源與目的位址進行檔案複製。

File.Copy(this.PDFSource, this.StoragePath);

Uri

藉由 Uri 類別可以得到 LocalPath, Hosr, Query 以及 Port 等資訊,對於要解讀 Uri 相當方便。

UriBuilder

此外如果要組 Uri 也可以使用 UriBuilder 來輔助,但在 Query 的部分仍屬於字串相加而已,不是那麼方便。

UriBuilder builder = new UriBuilder(this.Url);
builder.Query = $"q={0}&msg={this.Message}";

UrlDecode

[System.Web.HttpUtility]::UrlDecode(
  "https://www.google.com/search?q=%E5%BE%AE%E8%BB%9F")

可以得到 Decode 結果