عميل HTTP بلغة C#: تقنيات متقدمة للعمل مع الطلبات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

عميل HTTP بلغة C#: إجراء الطلبات بشكل صحيح — المستوى المتقدم



في تطوير .NET الحديث، يتجاوز العمل مع طلبات HTTP بكثير مجرد استدعاء WebClient أو HttpClient الأساسي. على المستوى المتقدم، يجب مراعاة إدارة تجمع الاتصالات، والمعالجة الصحيحة للأخطاء، والمهلات الزمنية، وسياسات إعادة المحاولة، والتنفيذ غير المتزامن. في هذه المقالة، سنستعرض أفضل الممارسات للعمل مع عميل HTTP في C# لمساعدتك في بناء تطبيقات موثوقة وعالية الأداء.



1. العمل الصحيح مع HttpClient وتجمع الاتصالات



أحد الأخطاء الأكثر شيوعًا هو إنشاء مثيل جديد من HttpClient لكل طلب. يؤدي ذلك إلى استنزاف المقابس (socket exhaustion) لأن كل مثيل يحتفظ باتصال TCP مفتوح في حالة TIME_WAIT.



غير صحيح:

public async Task<string> GetDataAsync(string url){    using (var client = new HttpClient())    {        return await client.GetStringAsync(url);    }}


صحيح: استخدم مثيلًا واحدًا ثابتًا أو مفردًا (singleton) من HttpClient.



public class HttpService{    private static readonly HttpClient _client = new HttpClient();

public async Task<string> GetDataAsync(string url) { return await _client.GetStringAsync(url); }}


للتحكم الدقيق، استخدم IHttpClientFactory من حزمة Microsoft.Extensions.Http. تدير المصنع تجمع الاتصالات وتستعيد الاتصالات تلقائيًا عند فشل DNS.



// في Startup.cs أو Program.csservices.AddHttpClient("MyClient", client =>{    client.BaseAddress = new Uri("https://api.example.com");    client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");});

// في الخدمةpublic class MyService{ private readonly IHttpClientFactory _httpClientFactory;

public MyService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; }

public async Task<string> GetDataAsync() { var client = _httpClientFactory.CreateClient("MyClient"); return await client.GetStringAsync("/data"); }}


2. المهلات الزمنية وإلغاء الطلبات



بدون مهلات زمنية، قد يتعطل عميلك إلى أجل غير مسمى. في HttpClient هناك آليتان:



  • Timeout — مهلة زمنية عامة للطلب بأكمله.
  • CancellationToken — لإلغاء الطلب من الخارج (مثل إغلاق المستخدم للتطبيق).


اضبط Timeout بشكل معقول. بالنسبة لمعظم واجهات API، 10–30 ثانية كافية.



var client = new HttpClient{    Timeout = TimeSpan.FromSeconds(15)};

// مثال مع CancellationTokenSourceusing var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));try{ var response = await client.GetAsync("https://slow-api.example.com", cts.Token);}catch (TaskCanceledException){ Console.WriteLine("تم إلغاء الطلب بسبب المهلة الزمنية.");}


هام: يعمل Timeout و CancellationToken معًا. إذا تم تفعيل CancellationToken مبكرًا، يتم إلغاء الطلب بشكل أسرع.



3. معالجة الأخطاء وسياسة إعادة المحاولة (Retry)



الأعطال الشبكية والأخطاء المؤقتة للخادم أمر شائع. بدلاً من الانهيار الفوري، قم بتنفيذ سياسة إعادة المحاولة مع تأخير أسي. لهذا الغرض، تعتبر مكتبة Polly مثالية.



using Polly;using Polly.Extensions.Http;

// تعريف سياسة إعادة المحاولةvar retryPolicy = HttpPolicyExtensions .HandleTransientHttpError() // 5xx, 408 .Or<HttpRequestException>() .WaitAndRetryAsync(3, retryAttempt => Tim

المدونات

توصيات الكتب