دریافت حجم فایل با استفاده از HttpClient در دات نت

ممکن است بخواهید قبل از دانلود یک فایل، حجم آن را دریافت کرده و به کاربر نمایش دهید. برای این کار لازم است با استفاده از متد HEAD درخواست خود را ارسال کنید.

در این مطلب نحوه ارسال درخواست HEAD را با استفاده از HttpClient در دات نت بررسی خواهیم کرد.

متد HEAD چیست؟

متد HTTP HEAD هدر هایی را از سرور درخواست می‌کند که هنگام ارسال درخواست HTTP GET برگشت داده می‌شوند. به عبارتی دیگر متد HEAD دقیقاً همانند GET عمل می‌کند با این تفاوت که سرور فقط Headerها را برگشت خواهد داد و پاسخ ارسال شده از سمت سرور فاقد هرگونه بدنه (Body) خواهد بود.

چگونه با استفاده از متد HEAD درخواست خود را ارسال کنیم؟

برای شروع، ابتدا یک نمونه جدید از کلاس HttpClient را ایجاد/دریافت کنید.

// HttpClient lifecycle management best practices:
// https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines#recommended-use
var client = new HttpClient();

پس از آن، یک HttpRequestMessage جدید را ایجاد کرده تا بتوانید HttpMethod را تنظیم کنید.

// using System.Net.Http;
var request = new HttpRequestMessage(HttpMethod.Head, url);

سپس درخواست خود را با استفاده از HttpRequestMessage ایجاد شده ارسال کنید.

var response = await client.SendAsync(request);

در ادامه لازم است ContentLength را از هدر محتوا بخوانید.

if (response.IsSuccessStatusCode)
{
    long? size = response.Content.Headers.ContentLength;
}

مقدار ContentLength به صورت bytes برگشت داده می‌شود، به همین دلیل برای نمایش آن به کاربر بهتر است با استفاده از پکیج نوگت ByteSize و یا موارد مشابه، آن را به سایر واحدها تبدیل کنید.

کد کامل

اکستنشن متد زیر حجم فایل را دریافت کرده و سپس برگشت خواهد داد و در غیر اینصورت null برگشت داده خواهد شد.

public static class HttpExtensions
{
    public static async Task<long?> GetFileSizeAsync(this HttpClient client, string url)
    {
        using (var request = new HttpRequestMessage(HttpMethod.Head, url))
        using (var response = await client.SendAsync(request))
        {
            if (response.IsSuccessStatusCode)
            {
                return response.Content.Headers.ContentLength;
            }
        }

        return null;
    }
}

کد جایگزین

در صورتی که تمایل ندارید از HttpRequestMessage استفاده کنید، می‌توانید از روش جایگزین زیر استفاده کنید.

public static async Task<long?> GetFileSizeAsync(this HttpClient client, string url)
{
    using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
    {
        if (response.IsSuccessStatusCode)
        {
            return response.Content.Headers.ContentLength;
        }
    }

    return null;
}

نحوه استفاده از اکستنشن متد

// HttpClient lifecycle management best practices:
// https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines#recommended-use
var client = new HttpClient();
var size = await client.GetFileSizeAsync("https://example.com/file.pdf");

برخورد با ارور های احتمالی

در کدهای فوق، قبل از خواندن ContentLength، نتیجه درخواست بررسی خواهد شد و در صورتی که سرور «کد وضعیت» موفقیت آمیز ارسال کرده باشد حجم فایل از هدر دریافت خواهد شد.

اما در هنگام استفاده از این کدها همچنان ممکن است HttpRequestException در مواردی مانند عدم دسترسی به سرور، مشکلات شبکه و... رخ دهد. پس لازم است این موارد را نیز در هنگام استفاده بررسی کنید.

اطلاعات بیشتر

نسخه انگلیسی این مطلب در سرویس dev.to قابل دسترسی است.

نظرات (0)