はじめに
本項では、HttpClientを利用して Basic認証が必要なサイトからファイルをダウンロードする方法の備忘録です。
リクエスト情報の作成
まずは、Basic認証情報をHttpRequestMessageとして作成します。
private HttpRequestMessage CreateConnectionRequest()
{
    string url = https://www.xxxx.xxxx.xxx/download/downloadfile.html
    var req = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = new Uri(url)
    };
    string userId = "xxxxxuser";
    string pass = "12345";
    req.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{userId}:{pass}")));
    return req;
}
ただ、実際のコードではユーザIDやパスワードはハードコーディングせず暗号化した状態でどこかに保持して利用すると思いますので、そこら辺は臨機応変に!
HttpClientを利用してファイルをダウンロードする
では先ほど作成したリクエスト情報を利用して、ファイルをダウンロードします。
public async Task DownloadFileAsync()
{
    var req = CreateConnectionRequest();
    try
    {
        HttpResponseMessage res = null;
        using (var httpClient = new HttpClient())
        {
            res = await httpClient.SendAsync(req);
        }
        if (res != null) 
        {
            using (var fileStream = File.Create($"D:¥work¥downloaded.html"))
            {
                using (var httpStream = await res.Content.ReasAsStreamAsync())
                {
                    httpStream.CopyTo(fileStream);
                    fileStream.Flush();
                }
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return false;
    }
    return true;
}
 基本的にはこれで問題ないですが、User-Agentをヘッダーに付与していないとエラーが発生します。
ですので、下記をつけておくと良いです(User-Agentはなんでも良い)
// 〜抜粋〜
using (var httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.Add("User-Agent", "hogehoge")
    res = await httpClient.SendAsync(req);
}
また、強制的にプロキシ経由でアクセスしたい場合は、HttpClientHandlerを追加します。
HttpClientHandler handler = new HttpClientHandler();
var proxy = new WebProxy("[proxy urlを設定]");
handler.Proxy = proxy;
handler.UseProxy = true;
using (var httpClient = new HttpClient(handler))
{
    httpClient.DefaultRequestHeaders.Add("User-Agent", "hogehoge")
    res = await httpClient.SendAsync(req);
}
最後に
今回はファイルのダウンロードに関しての記事でした。
上記は一例で、テキストファイルなどをダウンロードする際は、StreamReaderで内容を取得し、StreamWriterを利用してファイルに書き込むといったことも可能です。
機会があれば上記方法も載せておきたいと思います。

 
  
  
  
  
