API Gateway با Ocelot در C#

تاریخ: 1404/12/5 ساعت: 6:10 بازدید: 22

API Gateway چیست و چرا به آن نیاز داریم؟

وقتی وارد دنیای معماری میکروسرویس (Microservices Architecture) می‌شوی، اولین چیزی که باهاش دست‌وپنجه نرم می‌کنی، مسئله‌ی ارتباط بین سرویس‌هاست. تصور کن ده‌ها سرویس مجزا داری که هر کدام روی پورت و آدرس جداگانه‌ای اجرا می‌شن. کلاینت‌ها (مرورگر، اپ موبایل و…) باید با کدوم سرویس صحبت کنن؟ اینجاست که API Gateway وارد ماجرا می‌شه.

API Gateway یک نقطه‌ی ورودی واحد (Single Entry Point) برای تمام درخواست‌های کلاینت‌هاست. به زبان ساده، یه دربان هوشمند که:

  • درخواست‌ها را دریافت می‌کند
  • آن‌ها را به سرویس مناسب هدایت (Route) می‌کند
  • احراز هویت و اعتبارسنجی را مدیریت می‌کند
  • Load Balancing انجام می‌دهد
  • Rate Limiting اعمال می‌کند
  • Caching را مدیریت می‌کند

Ocelot چیست؟ معرفی کامل این فریم‌ورک قدرتمند

Ocelot یک کتابخانه‌ی متن‌باز (Open Source) برای پیاده‌سازی API Gateway در اکوسیستم .NET و C# است. این ابزار توسط جامعه‌ی بزرگ دات‌نت توسعه یافته و به‌خاطر سادگی، انعطاف و قدرت بالایش، بین برنامه‌نویسان ایرانی و خارجی محبوبیت زیادی پیدا کرده.

مهم‌ترین ویژگی‌های Ocelot عبارتند از:

  • Routing پیشرفته: هدایت درخواست‌ها بر اساس Path، Method، Header و…
  • Authentication & Authorization: پشتیبانی از JWT، OAuth2 و IdentityServer
  • Load Balancing: توزیع بار بین چند نمونه از یک سرویس
  • Rate Limiting: محدود کردن تعداد درخواست‌ها برای جلوگیری از سوءاستفاده
  • Caching: کش کردن پاسخ‌ها برای بهبود عملکرد
  • Circuit Breaker: مدیریت خطاها با الگوی مدار شکن
  • پشتیبانی از Consul و Service Discovery

پیش‌نیازها و محیط توسعه

قبل از اینکه شروع کنیم، مطمئن شو که موارد زیر را داری:

  • .NET 6 یا .NET 8 (جدیدترین نسخه‌های LTS)
  • Visual Studio 2022 یا VS Code
  • آشنایی پایه با ASP.NET Core Web API
  • آشنایی با مفهوم Microservices

آموزش گام به گام پیاده‌سازی API Gateway با Ocelot

گام اول: ساخت پروژه‌های میکروسرویس

فرض کن می‌خوایم یک سیستم ساده با دو میکروسرویس بسازیم:

  • ProductService — مدیریت محصولات (پورت 5001)
  • OrderService — مدیریت سفارشات (پورت 5002)
  • ApiGateway — درگاه اصلی (پورت 5000)

با دستورات زیر سه پروژه جداگانه می‌سازیم:


dotnet new webapi -n ProductService

dotnet new webapi -n OrderService

dotnet new webapi -n ApiGateway

گام دوم: نصب Ocelot در پروژه ApiGateway

وارد پروژه‌ی ApiGateway شو و پکیج Ocelot را نصب کن:


cd ApiGateway

dotnet add package Ocelot

اگر می‌خوای از قابلیت‌های پیشرفته‌تر مثل Service Discovery با Consul استفاده کنی:


dotnet add package Ocelot.Provider.Consul

dotnet add package Ocelot.Cache.CacheManager

گام سوم: پیکربندی Ocelot — فایل ocelot.json

قلب تپنده‌ی Ocelot، فایل ocelot.json است. این فایل را در ریشه‌ی پروژه ApiGateway بساز:


{

“Routes”: [

{

“DownstreamPathTemplate”: “/api/products/{everything}”,

“DownstreamScheme”: “https”,

“DownstreamHostAndPorts”: [

{

“Host”: “localhost”,

“Port”: 5001

}

],

“UpstreamPathTemplate”: “/products/{everything}”,

“UpstreamHttpMethod”: [ “GET”, “POST”, “PUT”, “DELETE” ]

},

{

“DownstreamPathTemplate”: “/api/orders/{everything}”,

“DownstreamScheme”: “https”,

“DownstreamHostAndPorts”: [

{

“Host”: “localhost”,

“Port”: 5002

}

],

“UpstreamPathTemplate”: “/orders/{everything}”,

“UpstreamHttpMethod”: [ “GET”, “POST”, “PUT”, “DELETE” ]

}

],

“GlobalConfiguration”: {

“BaseUrl”: “https://localhost:5000”

}

}

درک ساختار این فایل بسیار مهم است:

  • UpstreamPathTemplate: آدرسی که کلاینت می‌فرستد (مثلاً /products/1)
  • DownstreamPathTemplate: آدرسی که Ocelot به سرویس واقعی می‌فرستد
  • DownstreamHostAndPorts: آدرس و پورت سرویس مقصد
  • UpstreamHttpMethod: متدهای HTTP مجاز

گام چهارم: پیکربندی Program.cs

حالا باید Ocelot را به برنامه معرفی کنیم. فایل Program.cs را به این شکل تنظیم کن:


using Ocelot.DependencyInjection;

using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

// اضافه کردن فایل پیکربندی Ocelot

builder.Configuration.AddJsonFile(“ocelot.json”, optional: false, reloadOnChange: true);

// ثبت سرویس‌های Ocelot

builder.Services.AddOcelot(builder.Configuration);

var app = builder.Build();

// استفاده از Middleware ی Ocelot

await app.UseOcelot();

app.Run();

گام پنجم: پیاده‌سازی Load Balancing

یکی از قدرتمندترین ویژگی‌های Ocelot، Load Balancing داخلی آن است. فرض کن سرویس محصولات روی سه سرور اجرا می‌شه:


{

“DownstreamPathTemplate”: “/api/products/{everything}”,

“DownstreamScheme”: “https”,

“DownstreamHostAndPorts”: [

{ “Host”: “localhost”, “Port”: 5001 },

{ “Host”: “localhost”, “Port”: 5003 },

{ “Host”: “localhost”, “Port”: 5005 }

],

“LoadBalancerOptions”: {

“Type”: “RoundRobin”

},

“UpstreamPathTemplate”: “/products/{everything}”,

“UpstreamHttpMethod”: [ “GET”, “POST” ]

}

Ocelot از سه الگوریتم Load Balancing پشتیبانی می‌کند:

  • RoundRobin: درخواست‌ها به‌ترتیب بین سرورها توزیع می‌شن
  • LeastConnection: درخواست به سرور با کمترین اتصال فعال می‌ره
  • NoLoadBalancer: بدون توزیع بار (پیش‌فرض)

گام ششم: پیاده‌سازی Rate Limiting

Rate Limiting از سوءاستفاده از API جلوگیری می‌کند. با Ocelot به‌راحتی تنظیم می‌شه:


{

“UpstreamPathTemplate”: “/products/{everything}”,

“RateLimitOptions”: {

“ClientWhitelist”: [],

“EnableRateLimiting”: true,

“Period”: “1s”,

“PeriodTimespan”: 1,

“Limit”: 10

}

}

این تنظیمات یعنی: هر کلاینت در هر ثانیه حداکثر 10 درخواست می‌تواند ارسال کند.

گام هفتم: احراز هویت با JWT

یکی از متداول‌ترین نیازها در پروژه‌های واقعی، احراز هویت با JWT در لایه Gateway است. ابتدا پکیج مورد نیاز را نصب کن:


dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

سپس در Program.cs احراز هویت را اضافه کن:


builder.Services.AddAuthentication(“Bearer”)

.AddJwtBearer(“Bearer”, options =>

{

options.Authority = “https://your-identity-server”;

options.TokenValidationParameters = new TokenValidationParameters

{

ValidateAudience = false

};

});

builder.Services.AddOcelot(builder.Configuration);

و در ocelot.json مشخص کن کدام Route نیاز به احراز هویت دارد:


{

“UpstreamPathTemplate”: “/orders/{everything}”,

“AuthenticationOptions”: {

“AuthenticationProviderKey”: “Bearer”,

“AllowedScopes”: []

}

}

گام هشتم: Caching در Ocelot

برای بهبود پرفورمنس، می‌تونی پاسخ‌ها را کش کنی. ابتدا پکیج را نصب کن:


dotnet add package Ocelot.Cache.CacheManager

و در Program.cs:


builder.Services.AddOcelot(builder.Configuration)

.AddCacheManager(x => x.WithDictionaryHandle());

و در ocelot.json:


{

“UpstreamPathTemplate”: “/products/{everything}”,

“FileCacheOptions”: {

“TtlSeconds”: 30,

“Region”: “products-region”

}

}

🚀 می‌خوای سایتت در صفحه اول گوگل باشه؟

آیا می‌خواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگ‌خورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. سئو یک سرمایه‌گذاری مطمئن برای رشد کسب‌وکار شماست، نه یک هزینه!

📞 همین حالا برای مشاوره رایگان با ما تماس بگیرید:
09190994063 — 09376846692

مقایسه Ocelot با سایر API Gateway ها

بازار ابزارهای API Gateway شلوغه. بیایید Ocelot را با رقبا مقایسه کنیم:

  • Ocelot vs YARP: YARP (پروژه جدید مایکروسافت) عملکرد بهتری دارد اما Ocelot کانفیگ‌محورتر و ساده‌تر است.
  • Ocelot vs Kong: Kong قدرتمندتر اما پیچیده‌تر و نیاز به زیرساخت جداگانه دارد.
  • Ocelot vs AWS API Gateway: برای پروژه‌های Cloud-native AWS بهتر است، اما Ocelot Self-hosted و رایگان است.
  • Ocelot vs Nginx: Nginx سطح پایین‌تر و در لایه Reverse Proxy کار می‌کند؛ Ocelot در لایه Application.

بهترین شیوه‌ها (Best Practices) در استفاده از Ocelot

  • فایل ocelot.json را به چند فایل تقسیم کن: برای پروژه‌های بزرگ، Ocelot امکان استفاده از چند فایل پیکربندی را دارد.
  • از Correlation ID استفاده کن: برای ردیابی درخواست‌ها در بین میکروسرویس‌ها.
  • Logging را جدی بگیر: از Serilog یا NLog برای لاگ‌گیری دقیق استفاده کن.
  • Health Check اضافه کن: وضعیت سرویس‌ها را مانیتور کن.
  • از Circuit Breaker با Polly استفاده کن: برای مقاوم‌سازی در برابر خرابی سرویس‌ها.
  • Timeout مناسب تنظیم کن: از انتظار بی‌پایان جلوگیری کن.

پیکربندی پیشرفته: Aggregation در Ocelot

یکی از ویژگی‌های جالب Ocelot، قابلیت Request Aggregation است؛ یعنی یک درخواست کلاینت را به چند سرویس می‌فرستد و جواب‌ها را ترکیب می‌کند:


{

“Aggregates”: [

{

“RouteKeys”: [ “ProductRoute”, “OrderRoute” ],

“UpstreamPathTemplate”: “/dashboard”

}

],

“Routes”: [

{

“UpstreamPathTemplate”: “/products”,

“Key”: “ProductRoute”,

…

},

{

“UpstreamPathTemplate”: “/orders”,

“Key”: “OrderRoute”,

…

}

]

}

استقرار (Deployment) در Docker

در دنیای واقعی، API Gateway را با Docker مستقر می‌کنیم. فایل Dockerfile برای پروژه ApiGateway:


FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

WORKDIR /app

EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

WORKDIR /src

COPY [“ApiGateway.csproj”, “.”]

RUN dotnet restore

COPY . .

RUN dotnet build -c Release -o /app/build

FROM build AS publish

RUN dotnet publish -c Release -o /app/publish

FROM base AS final

WORKDIR /app

COPY --from=publish /app/publish .

ENTRYPOINT [“dotnet”, “ApiGateway.dll”]

💡 نکته مهم برای تیم‌های ایرانی: اگر پروژه‌ات روی زیرساخت ابری ایرانی (مثل آروان‌کلاد یا لیارا) هست، Ocelot بدون هیچ مشکلی روی این پلتفرم‌ها هم کار می‌کنه و نیازی به تغییرات اضافه نداری.

رفع خطاهای رایج در Ocelot

  • خطای 404 بعد از Route: مطمئن شو DownstreamPathTemplate با آدرس واقعی API مقصد مطابقت داشته باشد.
  • خطای SSL: برای محیط توسعه، از http استفاده کن یا certificate validation را غیرفعال کن.
  • خطای 401 Unauthorized: ترتیب میان‌افزارها در Program.cs را بررسی کن؛ Authentication باید قبل از UseOcelot باشد.
  • مشکل Timeout: مقدار QoSOptions را در ocelot.json تنظیم کن.

📈 کسب‌وکار آنلاین بدون سئو، مثل فروشگاهی بدون تابلوست!

آیا می‌خواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگ‌خورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. با یک تماس ساده، مسیر رشد کسب‌وکارت را شروع کن!

📞 مشاوره رایگان: 09190994063 — 09376846692

جمع‌بندی

Ocelot یکی از بهترین انتخاب‌ها برای پیاده‌سازی API Gateway در اکوسیستم .NET است. با ترکیب سادگی پیکربندی، قابلیت‌های غنی مثل Rate Limiting، Load Balancing، Caching و JWT Authentication، و پشتیبانی قوی جامعه متن‌باز، این ابزار می‌تواند نیاز اکثر پروژه‌های میکروسرویس را برطرف کند.

برای پروژه‌های کوچک تا متوسط، Ocelot گزینه‌ی ایده‌آلی است. اگر پروژه‌ات در حال رشد سریع است و به عملکرد بالاتری نیاز داری، بررسی YARP (پروژه Microsoft) هم توصیه می‌شه.


سوالات متداول (FAQ)

۱. آیا Ocelot برای پروژه‌های بزرگ مناسب است؟

Ocelot برای پروژه‌های متوسط تا بزرگ مناسب است. اما اگر ترافیک بسیار بالایی دارید (میلیون‌ها درخواست در روز)، بهتر است YARP یا ابزارهای سطح Enterprise مثل Kong را بررسی کنید. برای اکثر استارتاپ‌ها و پروژه‌های ایرانی، Ocelot کاملاً کافی است.

۲. تفاوت Ocelot با Reverse Proxy مثل Nginx چیست؟

Nginx یک Reverse Proxy در لایه‌ی شبکه است و با فایل‌های config کار می‌کند. Ocelot یک API Gateway در لایه Application است که با کد .NET پیاده‌سازی می‌شود، امکان نوشتن Middleware سفارشی دارد، و با اکوسیستم .NET (مثل Dependency Injection) کاملاً یکپارچه است.

۳. آیا می‌توان Ocelot را با IdentityServer4 یا Keycloak ترکیب کرد؟

بله! Ocelot از JWT Bearer Authentication پشتیبانی کامل دارد و می‌توان آن را با هر Identity Provider که توکن JWT صادر می‌کند (مثل IdentityServer4، Keycloak، Auth0 و…) ترکیب کرد. این یکی از رایج‌ترین معماری‌ها در پروژه‌های میکروسرویس است.

۴. چطور می‌توان Ocelot را با Kubernetes و Service Discovery ترکیب کرد؟

Ocelot از Consul و Eureka برای Service Discovery پشتیبانی می‌کند. با نصب پکیج Ocelot.Provider.Consul و تنظیم مناسب، می‌توانید آدرس سرویس‌ها را به‌صورت داینامیک از Consul دریافت کنید. در محیط Kubernetes هم می‌توان از DNS داخلی k8s به‌عنوان روش ساده‌تری استفاده کرد.

۵. آیا Ocelot از WebSocket و gRPC پشتیبانی می‌کند؟

Ocelot از WebSocket به‌صورت محدود پشتیبانی می‌کند. برای gRPC، پیشنهاد می‌شود از YARP یا Envoy استفاده شود چون این ابزارها پشتیبانی بهتری از پروتکل HTTP/2 که پایه‌ی gRPC است دارند. اما برای REST API های معمولی، Ocelot کاملاً مناسب است.

۶. چطور Ocelot را برای محیط Production بهینه کنیم؟

برای محیط Production توصیه می‌شود: ۱) Caching را فعال کنید. ۲) Rate Limiting مناسب تنظیم کنید. ۳) Circuit Breaker با Polly پیاده‌سازی کنید. ۴) Logging دقیق با Correlation ID داشته باشید. ۵) Health Check endpoint اضافه کنید. ۶) Timeout های مناسب در QoSOptions تنظیم کنید.

نمایش کد

نظرات کاربران


پویا نظری
تاریخ 1404/12/5 ساعت 18:56

در مورد Health Check در Ocelot. آیا خود Ocelot قابلیتی برای مانیتورینگ Health سرویس‌های Downstream داره یا باید جداگانه پیاده‌سازی بشه؟

سایت اینجا:

Ocelot به صورت مستقیم Health Check داخلی برای سرویس‌های Downstream ندارد، اما می‌توانید با استفاده از کتابخانه‌هایی مانند HealthChecks.UI در کنار Ocelot، وضعیت سرویس‌ها را مانیتور کنید. برای سئو و رشد کسب‌وکار خود نیز با ما در ارتباط باشید: 09190994063 – 09376846692

رضا کریمی
تاریخ 1404/12/5 ساعت 18:56

ممنون از توضیحات عالی. پیاده‌سازی Rate Limiting و Caching خیلی راحت به نظر میاد. آیا تنظیمات پیش‌فرض برای Caching در Ocelot مناسبه یا باید بهینه بشه؟

سایت اینجا:

تنظیمات پیش‌فرض Caching در Ocelot معمولاً برای شروع مناسب است، اما برای بهینه‌سازی در محیط Production توصیه می‌شود TTL و Region را با توجه به نیازهای پروژه خود تنظیم کنید. مشاوره رایگان: 09190994063 – 09376846692

مجید یوسفی
تاریخ 1404/12/5 ساعت 16:9

سلام. با خطای 404 بعد از Route مواجه شدم. مطمئن هستم DownstreamPathTemplate درسته. مشکل از چی می‌تونه باشه؟

سایت اینجا:

سلام. علاوه بر DownstreamPathTemplate، لطفاً UpstreamPathTemplate، UpstreamHttpMethod و همچنین پورت و آدرس سرویس مقصد (DownstreamHostAndPorts) را به دقت بررسی کنید. ترتیب میان‌افزارها در Program.cs هم مهم است. برای رفع مشکل می‌توانید با ما تماس بگیرید: 09190994063 – 09376846692

زهرا شریفی
تاریخ 1404/12/5 ساعت 14:59

تفاوت Ocelot با AWS API Gateway برای پروژه‌های Cloud-native چیه؟ آیا Ocelot قابلیت‌های مشابهی داره؟

سایت اینجا:

AWS API Gateway برای محیط Cloud-native AWS یکپارچه‌تر و قدرتمندتر است، اما Ocelot یک راهکار Self-hosted و رایگان است که قابلیت‌های مشابهی را برای پروژه‌های .NET فراهم می‌کند. انتخاب بستگی به زیرساخت و نیازهای شما دارد. برای مشاوره تماس بگیرید: 09190994063 – 09376846692

فاطمه حسینی
تاریخ 1404/12/5 ساعت 14:59

سوال من اینه که آیا Ocelot برای پروژه‌های با ترافیک خیلی بالا و میلیونی هم مناسبه یا باید به فکر YARP باشیم؟

سایت اینجا:

درود بر شما. Ocelot برای اکثر پروژه‌های متوسط تا بزرگ کافی است، اما برای ترافیک میلیونی و بسیار بالا، بررسی YARP یا Kong توصیه می‌شود. برای جزئیات بیشتر تماس بگیرید: 09190994063 – 09376846692

حسن پور
تاریخ 1404/12/5 ساعت 13:48

واقعاً کامل بود. یک سوال در مورد استقرار در داکر: آیا باید هر سه سرویس (ProductService, OrderService, ApiGateway) را در یک Docker Compose تعریف کنیم یا جداگانه؟

سایت اینجا:

بهتر است هر سه سرویس را در یک فایل Docker Compose تعریف کنید تا مدیریت شبکه‌بندی و بالا آوردن همزمان آن‌ها راحت‌تر باشد. برای راهنمایی در پیاده‌سازی با داکر با ما تماس بگیرید: 09190994063 – 09376846692

سارا نوری
تاریخ 1404/12/5 ساعت 12:12

مطالب بسیار کاربردی و توضیحات قدم به قدم عالی بود. برای پروژه‌هایی که روی زیرساخت ابری ایرانی هستند، استفاده از Ocelot مشکلی ایجاد نمی‌کنه؟

سایت اینجا:

خوشحالیم که مورد توجه شما قرار گرفته. همانطور که در متن اشاره شد، Ocelot بدون هیچ مشکلی روی زیرساخت‌های ابری ایرانی (مثل آروان‌کلاد یا لیارا) کار می‌کند. برای سئو سایتتان نیز می‌توانید با ما تماس بگیرید: 09190994063 – 09376846692

امیر قاسمی
تاریخ 1404/12/5 ساعت 11:1

میشه در مورد استفاده از Correlation ID برای ردیابی درخواست‌ها در Ocelot بیشتر توضیح بدید؟ چطور باید این رو پیاده‌سازی کرد؟

سایت اینجا:

Correlation ID معمولاً توسط یک Middleware در API Gateway تولید و به هدر درخواست‌ها اضافه می‌شود تا در کل زنجیره میکروسرویس‌ها ردیابی شوند. می‌توانید یک Middleware سفارشی برای این کار بنویسید. برای سئو سایت خود نیز با ما تماس بگیرید: 09190994063 – 09376846692

علی محمدی
تاریخ 1404/12/5 ساعت 11:1

ممنون بابت آموزش جامع و کامل. واقعاً نیاز داشتم که API Gateway و Ocelot رو به صورت عملی یاد بگیرم. تفاوتش با Nginx هم خیلی واضح توضیح داده شده بود.

سایت اینجا:

خواهش می‌کنیم. خوشحالیم که آموزش مفید واقع شده است. برای مشاوره بیشتر می‌توانید با شماره‌های 09190994063 و 09376846692 تماس بگیرید.

نگین اسدی
تاریخ 1404/12/5 ساعت 9:50

Ocelot واقعاً ابزار قدرتمندی برای .NET هست. سوالی که برام پیش اومد اینه که آیا میشه پیکربندی ocelot.json رو از دیتابیس یا سرویس‌های پیکربندی مثل Consul/Vault لود کرد؟

سایت اینجا:

بله، Ocelot قابلیت لود کردن پیکربندی از منابع مختلف از جمله Consul (با استفاده از پکیج Ocelot.Provider.Consul) را دارد. این روش برای محیط‌های پویا و میکروسرویس‌ها بسیار کاربردی است. برای کسب اطلاعات بیشتر تماس بگیرید: 09190994063 – 09376846692

مریم احمدی
تاریخ 1404/12/5 ساعت 9:50

با سلام. در بخش احراز هویت با JWT، 'https://your-identity-server' رو چطور باید مقداردهی کنیم؟ منظور از Identity Server دقیقاً چیه؟

سایت اینجا:

سلام. 'your-identity-server' آدرس سرور احراز هویت شماست که توکن JWT را صادر می‌کند؛ می‌تواند IdentityServer4، Keycloak، Auth0 یا هر سرویس مشابه دیگری باشد. برای راهنمایی بیشتر تماس بگیرید: 09190994063 – 09376846692

لیلا حیدری
تاریخ 1404/12/5 ساعت 7:4

قابلیت Request Aggregation در Ocelot خیلی جالب و کاربردیه. آیا نمونه‌های پیچیده‌تری از Aggregation هم میشه پیاده‌سازی کرد؟ مثلاً ترکیب اطلاعات از چندین سرویس و تغییر فرمت خروجی؟

سایت اینجا:

بله، Ocelot امکان Aggregation را فراهم می‌کند. برای سناریوهای پیچیده‌تر که نیاز به تغییر فرمت پاسخ دارید، ممکن است نیاز به نوشتن یک Middleware سفارشی داشته باشید. برای مشاوره تخصصی تماس بگیرید: 09190994063 – 09376846692