راهنمای جامع استفاده از HttpClient در ASP.NET Core API
فراخوانی سرویسهای دیگر یکی از کارهای روزمره توسعهدهندگان ASP.NET Core است. برای این کار، HttpClient ابزار استاندارد و قدرتمند مایکروسافت محسوب میشود. اما استفاده نادرست از آن میتواند مشکلات جدی در عملکرد و پایداری برنامه شما ایجاد کند. این مقاله یک راهنمای کامل برای استفاده از HttpClient در ASP.NET Core API به روشی مدرن و بهینه است.در این مطلب، ما به شما نشان میدهیم که چگونه با استفاده از IHttpClientFactory، ارتباطات شبکهای خود را به صورت حرفهای مدیریت کنید. بنابراین، با پیچیدگیهای قدیمی خداحافظی کرده و روشهای جدید را بیاموزید. این رویکرد نه تنها کد شما را تمیزتر میکند، بلکه از بروز خطاهای رایج نیز جلوگیری خواهد کرد. بیایید شروع کنیم! 🚀
چرا HttpClient بهترین انتخاب است؟
HttpClient یک کلاس قدرتمند برای ارسال درخواستهای HTTP و دریافت پاسخهای HTTP از یک منبع مشخص شده با URI است. در گذشته، توسعهدهندگان مستقیماً یک نمونه جدید از HttpClient برای هر درخواست ایجاد میکردند.
// روش قدیمی و مشکلساز ❌
using (var client = new HttpClient())
{
var result = await client.GetAsync("https://api.example.com/data");
// ...
}
این روش یک مشکل بزرگ به نام “فرسودگی سوکت” (Socket Exhaustion) ایجاد میکند. هر نمونه جدید HttpClient یک سوکت شبکه را اشغال کرده و آن را برای مدتی در حالت TIME_WAIT نگه میدارد. با افزایش ترافیک، این مسئله منجر به کمبود منابع و از کار افتادن برنامه میشود.
معرفی IHttpClientFactory: راهکار مدرن و بهینه
مایکروسافت برای حل این مشکل، IHttpClientFactory را در ASP.NET Core 2.1 معرفی کرد. این ابزار، یک راهکار متمرکز برای ایجاد و مدیریت نمونههای HttpClient فراهم میکند. در نتیجه، مشکلات مربوط به مدیریت طول عمر و فرسودگی سوکت به طور کامل حل میشود.
مزایای کلیدی استفاده از IHttpClientFactory
استفاده از این الگو مزایای فوقالعادهای برای پروژههای شما به همراه دارد.
- ✅ مدیریت بهینه سوکتها:
IHttpClientFactoryاتصالات شبکه را در یک Pool مدیریت میکند. این کار از ایجاد بیرویه سوکتهای جدید جلوگیری کرده و آنها را مجدداً استفاده میکند. - ✅ مدیریت طول عمر HttpClient: این ابزار به طور هوشمند طول عمر
HttpClientHandlerها را مدیریت میکند تا مشکلات DNS نیز بروز نکند. - ✅ پیکربندی متمرکز: شما میتوانید تمام تنظیمات مربوط به
HttpClientمانندBaseAddress،HeadersوTimeoutرا در یک مکان مرکزی (فایلProgram.cs) پیکربندی کنید. - ✅ افزودن Middleware: به راحتی میتوانید از کتابخانههایی مانند Polly برای پیادهسازی الگوهای پایداری (Resiliency Patterns) مانند Retry و Circuit Breaker استفاده کنید.
راهنمای گام به گام: استفاده از ASP.NET Core API با HttpClient
حالا بیایید به صورت عملی نحوه استفاده از این ابزار قدرتمند را بررسی کنیم. این فرآیند بسیار ساده و سرراست است.
گام اول: پیکربندی IHttpClientFactory در Program.cs
ابتدا باید سرویس HttpClient را در کانتینر وابستگی (DI Container) برنامه خود ثبت کنید. این کار در فایل Program.cs (در .NET 6 و جدیدتر) انجام میشود.
var builder = WebApplication.CreateBuilder(args);
// اضافه کردن سرویس HttpClient به DI Container
builder.Services.AddHttpClient();
// سایر سرویسها
builder.Services.AddControllers();
var app = builder.Build();
// ...
گام دوم: ساخت یک سرویس برای فراخوانی API
بهترین روش، ایجاد یک کلاس سرویس جداگانه برای منطق فراخوانی API است. در این کلاس، IHttpClientFactory را از طریق Constructor تزریق میکنیم.
public class MyApiService
{
private readonly IHttpClientFactory _httpClientFactory;
public MyApiService(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<string?> GetDataFromApiAsync()
{
// یک نمونه HttpClient از Factory ایجاد میکنیم
var client = _httpClientFactory.CreateClient();
// ارسال درخواست GET
var response = await client.GetAsync("https://api.example.com/products");
if (response.IsSuccessStatusCode)
{
// خواندن محتوای پاسخ
string content = await response.Content.ReadAsStringAsync();
return content;
}
return null;
}
}
گام سوم: ارسال درخواستهای POST و PUT
برای ارسال داده (مثلاً در فرمت JSON) در درخواستهای POST یا PUT، میتوانید از کلاس JsonContent استفاده کنید. این روش کد شما را تمیزتر و خواناتر میکند.
public async Task CreateProductAsync(ProductDto newProduct)
{
var client = _httpClientFactory.CreateClient();
// ایجاد محتوای JSON و ارسال درخواست POST
var response = await client.PostAsJsonAsync("https://api.example.com/products", newProduct);
// بررسی موفقیتآمیز بودن عملیات
response.EnsureSuccessStatusCode();
}
گام چهارم: مدیریت پاسخ (HttpResponseMessage)
همیشه وضعیت پاسخ دریافت شده را بررسی کنید. شی HttpResponseMessage متدهای مفیدی برای این کار دارد.
IsSuccessStatusCode: یک مقدارboolبرمیگرداند که نشاندهنده موفقیت (کدهای 2xx) است.EnsureSuccessStatusCode(): اگر درخواست موفقیتآمیز نباشد، یک استثنا (HttpRequestException) پرتاب میکند.ReadAsStringAsync(): محتوای پاسخ را به صورت رشته میخواند.ReadFromJsonAsync<T>(): محتوای JSON را مستقیماً به یک شی از نوعTتبدیل میکند.
کاربردهای عملی HttpClient در پروژهها
HttpClient و IHttpClientFactory ستون فقرات ارتباطات خارجی در بسیاری از برنامههای مدرن هستند.
- 💡 ارتباط با سرویسهای ثالث: برای اتصال به درگاههای پرداخت، سرویسهای ایمیل، یا APIهای شبکههای اجتماعی.
- 💡 ساخت معماری میکروسرویس: برای برقراری ارتباط امن و پایدار بین سرویسهای مختلف در یک معماری میکروسرویس.
- 💡 دریافت داده از منابع عمومی: برای فراخوانی APIهای عمومی مانند اطلاعات آب و هوا، نرخ ارز یا اخبار.
- 💡 ارسال داده به وبهوکها (Webhooks): برای اطلاعرسانی به سیستمهای دیگر در مورد وقوع یک رویداد خاص.

ثبتنام و دریافت کلید API
بسیاری از APIها برای استفاده نیاز به یک کلید اختصاصی (API Key) دارند. این کلید هویت برنامه شما را تأیید میکند. معمولاً برای دریافت کلید، باید در وبسایت ارائهدهنده سرویس ثبتنام کنید. 🔑
برای مثال، اگر از یک پلتفرم API مدیریت شده استفاده میکنید، ابتدا باید یک حساب کاربری بسازید. برای شروع و ایجاد حساب، میتوانید از طریق لینک p.api.ir اقدام کرده و مراحل ثبتنام را طی کنید تا کلید API خود را دریافت نمایید.
نکات نهایی برای حرفهایها
استفاده از IHttpClientFactory یک استاندارد صنعتی در توسعه ASP.NET Core است. این ابزار نه تنها از مشکلات عملکردی جلوگیری میکند، بلکه کد شما را برای توسعه و نگهداری در آینده آماده میسازد.
نکات کلیدی را به خاطر بسپارید:
- همیشه
IHttpClientFactoryرا به جایnew HttpClient()به کار ببرید. - منطق فراخوانی API را در کلاسهای سرویس مجزا قرار دهید.
- همواره از نسخههای
asyncمتدها (مانندGetAsync) استفاده کنید تا برنامه شما Non-blocking باقی بماند. - پاسخها و خطاهای احتمالی را به درستی مدیریت کنید.
امیدواریم این راهنما به شما در نوشتن کدهای بهتر و پایدارتر کمک کرده باشد. تجربیات و سوالات خود را در بخش نظرات با ما در میان بگذارید! ✍️
- برچسب ها:
- api
- api چیست
- HttpClient
