从 url 下载文件并转换为 base64 异步 (C#)

Eug*_*ukh -1 c# asp.net asp.net-core

我有需要下载文件并转换为 Base64 字符串的 url

我写了这段代码来做到这一点

private string GetImageAsBase64(string url)
    {
        using (var client = new WebClient())
        {
            var bytes = client.DownloadData(url);
            var base64String = Convert.ToBase64String(bytes);
            return base64String;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何使其异步使用返回类型Task<string>

tim*_*mur 7

你就快到了,使用GetByteArrayAsync

private async Task<string> GetImageAsBase64Async(string url) // return Task<string>
{
    using (var client = new HttpClient())
    {
        var bytes = await client.GetByteArrayAsync(url); // there are other methods if you want to get involved with stream processing etc
        var base64String = Convert.ToBase64String(bytes);
        return base64String;
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD

正如@Fildor指出的,您希望实例化HttpClient一次并将其注入到函数中。一个非常简单的方法是使用扩展方法:

void Main()
{
    HttpClient client = new HttpClient(); // can reuse
    client.GetImageAsBase64("...");
    client.GetImageAsBase64("...");
    client.GetImageAsBase64("...");
}

static class HttpclientExtensions
{
    public static async Task<string> GetImageAsBase64(this HttpClient client, string url)
    {
        var bytes = await client.GetByteArrayAsync(url);
        return Convert.ToBase64String(bytes);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • OP:请注意,您不应该使用“using (var client = new HttpClient())”。使用静态 HttpClient 或使用依赖项注入(使用 [IHttpClientFactory](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient -http-请求))。 (2认同)