میان افزارها در .NET – انجمن DEV

Summarize this content to 400 words in Persian Lang
در توسعه برنامه های کاربردی وب مدرن، مدیریت موثر درخواست های HTTP برای عملکرد، امنیت و نگهداری بسیار مهم است. در دات نت، میان افزارها برای پیکربندی خط لوله پردازش درخواست ضروری هستند و به توسعه دهندگان اجازه می دهند تا درخواست ها و پاسخ ها را به صورت ماژولار و قابل توسعه مدیریت کنند. این مقاله به بررسی چیستی میان افزارها، نحوه پیاده سازی آن ها در دات نت و بهترین روش ها برای استفاده موثر از آنها می پردازد.
Middleware چیست؟
برنامه وب خود را مانند آشپزخانه رستوران در نظر بگیرید. هنگامی که مشتری سفارشی می دهد (درخواست HTTP)، سفارش از ایستگاه های مختلف (middleware) در آشپزخانه می گذرد که هر کدام وظیفه خاص خود را دارند، قبل از رسیدن به میز مشتری (پاسخ HTTP).
یک میان افزار به عنوان یکی از این ایستگاه ها عمل می کند. هر میان افزار می تواند:
درخواست های HTTP ورودی را پردازش کنید.
منطق را قبل و/یا پس از ارسال درخواست به میان افزار بعدی اجرا کنید.
درخواست را خاتمه دهید یا آن را از طریق زنجیره میان افزارها عبور دهید.
این طراحی به توسعه دهندگان اجازه می دهد تا ویژگی های متقاطع مانند احراز هویت، ورود به سیستم، مدیریت خطا و موارد دیگر را به صورت ماژولار اضافه کنند.
انواع میان افزارها
در ASP.NET Core، میان افزارها را می توان به سه نوع اصلی دسته بندی کرد:
میان افزارهای شخص ثالث: ارائه شده توسط کتابخانه های خارجی، مانند احراز هویت OAuth.
میان افزارهای داخلی: شامل ASP.NET Core، مانند رسیدگی به خطا، احراز هویت، و مجوز.
میان افزارهای سفارشی: توسط کاربران برای نیازهای خاص ایجاد شده است.
ساختار پروژه در دات نت
در دات نت، نقطه ورود یک برنامه کاربردی در Program کلاس، جایی که خط لوله میان افزار و خدمات لازم پیکربندی شده است.
پروژه نمونه
با ایجاد یک پروژه ASP.NET Core جدید شروع کنید:
dotnet new web -n MiddlewareExample
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ساختار اصلی پروژه شامل الف Program.cs کلاس
Program.cs کلاس
در Program کلاس، میان افزارها و سرویس ها را پیکربندی می کنید. این یک مثال کامل است:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
var builder = WebApplication.CreateBuilder(args);
// Configure services
builder.Services.AddControllers();
var app = builder.Build();
// Configure the middleware pipeline
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// Custom middleware
app.UseMiddlewareLoggingMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.Run();
// Custom middleware
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILoggerLoggingMiddleware> _logger;
public LoggingMiddleware(RequestDelegate next, ILoggerLoggingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
_logger.LogInformation($”Incoming request: {context.Request.Method} {context.Request.Path}”);
await _next(context);
_logger.LogInformation($”Outgoing response: {context.Response.StatusCode}”);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
میان افزارهای داخلی
ASP.NET Core دارای چندین میان افزار داخلی است که معمولاً در برنامه ها استفاده می شوند.
رسیدگی به خطا
میانافزار مدیریت خطا، استثناهای کنترل نشده را میگیرد و یک پاسخ خطای کاربرپسند ارائه میکند:
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
احراز هویت و مجوز
برای افزودن احراز هویت و مجوز:
app.UseAuthentication();
app.UseAuthorization();
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
میان افزار فشرده سازی پاسخ
برای افزودن فشرده سازی پاسخ:
builder.Services.AddResponseCompression();
app.UseResponseCompression();
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ایجاد یک میان افزار سفارشی
میان افزار سفارشی از ساختار خاصی پیروی می کند. در اینجا نمونه ای از میان افزاری است که زمان پردازش درخواست را اندازه گیری می کند:
میان افزار زمان بندی را درخواست کنید
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILoggerRequestTimingMiddleware> _logger;
public RequestTimingMiddleware(RequestDelegate next, ILoggerRequestTimingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var startTime = DateTime.UtcNow;
context.Response.OnStarting(() =>
{
var duration = DateTime.UtcNow – startTime;
context.Response.Headers[“X-Processing-Time-Milliseconds”] = duration.TotalMilliseconds.ToString();
return Task.CompletedTask;
});
await _next(context);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برای ثبت این میان افزار در خط لوله:
app.UseMiddlewareRequestTimingMiddleware>();
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بهترین شیوه ها
سفارش میان افزارها: ترتیبی که میان افزارها در آن ثبت می شوند بسیار مهم است. اطمینان حاصل کنید که احراز هویت، مجوز، و میان افزارهای رسیدگی به خطا به درستی قرار گرفته اند.
اجتناب از منطق سنگین: میان افزارها باید سبک و سریع باشند. از انجام عملیات گران قیمت در داخل آنها خودداری کنید.
استفاده مجدد: تا حد امکان از میان افزارهای داخلی و شخص ثالث برای جلوگیری از اختراع مجدد چرخ استفاده کنید.
رسیدگی به استثنا: برای جلوگیری از نشت اطلاعات و حفظ پاسخها، استثناها را در میان افزارها مدیریت کنید.
ثبت صحیح: برای نظارت بر رفتار میانافزار و کمک به اشکالزدایی، گزارشگیری مؤثر را اجرا کنید.
نتیجه
میان افزارها اجزای حیاتی در ASP.NET Core هستند که مدیریت و پردازش ماژولار درخواست های HTTP را امکان پذیر می کنند. با دات نت، پیکربندی و استفاده از میان افزارها ساده و متمرکز شده است Program کلاس
منبع اطلاعات
مستندات رسمی مایکروسافت در مورد Middlewares در هسته ASP.NET
مثال ها و بهترین روش ها در GitHub
در توسعه برنامه های کاربردی وب مدرن، مدیریت موثر درخواست های HTTP برای عملکرد، امنیت و نگهداری بسیار مهم است. در دات نت، میان افزارها برای پیکربندی خط لوله پردازش درخواست ضروری هستند و به توسعه دهندگان اجازه می دهند تا درخواست ها و پاسخ ها را به صورت ماژولار و قابل توسعه مدیریت کنند. این مقاله به بررسی چیستی میان افزارها، نحوه پیاده سازی آن ها در دات نت و بهترین روش ها برای استفاده موثر از آنها می پردازد.
Middleware چیست؟
برنامه وب خود را مانند آشپزخانه رستوران در نظر بگیرید. هنگامی که مشتری سفارشی می دهد (درخواست HTTP)، سفارش از ایستگاه های مختلف (middleware) در آشپزخانه می گذرد که هر کدام وظیفه خاص خود را دارند، قبل از رسیدن به میز مشتری (پاسخ HTTP).
یک میان افزار به عنوان یکی از این ایستگاه ها عمل می کند. هر میان افزار می تواند:
- درخواست های HTTP ورودی را پردازش کنید.
- منطق را قبل و/یا پس از ارسال درخواست به میان افزار بعدی اجرا کنید.
- درخواست را خاتمه دهید یا آن را از طریق زنجیره میان افزارها عبور دهید.
این طراحی به توسعه دهندگان اجازه می دهد تا ویژگی های متقاطع مانند احراز هویت، ورود به سیستم، مدیریت خطا و موارد دیگر را به صورت ماژولار اضافه کنند.
انواع میان افزارها
در ASP.NET Core، میان افزارها را می توان به سه نوع اصلی دسته بندی کرد:
- میان افزارهای شخص ثالث: ارائه شده توسط کتابخانه های خارجی، مانند احراز هویت OAuth.
- میان افزارهای داخلی: شامل ASP.NET Core، مانند رسیدگی به خطا، احراز هویت، و مجوز.
- میان افزارهای سفارشی: توسط کاربران برای نیازهای خاص ایجاد شده است.
ساختار پروژه در دات نت
در دات نت، نقطه ورود یک برنامه کاربردی در Program
کلاس، جایی که خط لوله میان افزار و خدمات لازم پیکربندی شده است.
پروژه نمونه
با ایجاد یک پروژه ASP.NET Core جدید شروع کنید:
dotnet new web -n MiddlewareExample
ساختار اصلی پروژه شامل الف Program.cs
کلاس
Program.cs
کلاس
در Program
کلاس، میان افزارها و سرویس ها را پیکربندی می کنید. این یک مثال کامل است:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
var builder = WebApplication.CreateBuilder(args);
// Configure services
builder.Services.AddControllers();
var app = builder.Build();
// Configure the middleware pipeline
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// Custom middleware
app.UseMiddlewareLoggingMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.Run();
// Custom middleware
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILoggerLoggingMiddleware> _logger;
public LoggingMiddleware(RequestDelegate next, ILoggerLoggingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
_logger.LogInformation($"Incoming request: {context.Request.Method} {context.Request.Path}");
await _next(context);
_logger.LogInformation($"Outgoing response: {context.Response.StatusCode}");
}
}
میان افزارهای داخلی
ASP.NET Core دارای چندین میان افزار داخلی است که معمولاً در برنامه ها استفاده می شوند.
رسیدگی به خطا
میانافزار مدیریت خطا، استثناهای کنترل نشده را میگیرد و یک پاسخ خطای کاربرپسند ارائه میکند:
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
احراز هویت و مجوز
برای افزودن احراز هویت و مجوز:
app.UseAuthentication();
app.UseAuthorization();
میان افزار فشرده سازی پاسخ
برای افزودن فشرده سازی پاسخ:
builder.Services.AddResponseCompression();
app.UseResponseCompression();
ایجاد یک میان افزار سفارشی
میان افزار سفارشی از ساختار خاصی پیروی می کند. در اینجا نمونه ای از میان افزاری است که زمان پردازش درخواست را اندازه گیری می کند:
میان افزار زمان بندی را درخواست کنید
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILoggerRequestTimingMiddleware> _logger;
public RequestTimingMiddleware(RequestDelegate next, ILoggerRequestTimingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var startTime = DateTime.UtcNow;
context.Response.OnStarting(() =>
{
var duration = DateTime.UtcNow - startTime;
context.Response.Headers["X-Processing-Time-Milliseconds"] = duration.TotalMilliseconds.ToString();
return Task.CompletedTask;
});
await _next(context);
}
}
برای ثبت این میان افزار در خط لوله:
app.UseMiddlewareRequestTimingMiddleware>();
بهترین شیوه ها
-
سفارش میان افزارها: ترتیبی که میان افزارها در آن ثبت می شوند بسیار مهم است. اطمینان حاصل کنید که احراز هویت، مجوز، و میان افزارهای رسیدگی به خطا به درستی قرار گرفته اند.
-
اجتناب از منطق سنگین: میان افزارها باید سبک و سریع باشند. از انجام عملیات گران قیمت در داخل آنها خودداری کنید.
-
استفاده مجدد: تا حد امکان از میان افزارهای داخلی و شخص ثالث برای جلوگیری از اختراع مجدد چرخ استفاده کنید.
-
رسیدگی به استثنا: برای جلوگیری از نشت اطلاعات و حفظ پاسخها، استثناها را در میان افزارها مدیریت کنید.
-
ثبت صحیح: برای نظارت بر رفتار میانافزار و کمک به اشکالزدایی، گزارشگیری مؤثر را اجرا کنید.
نتیجه
میان افزارها اجزای حیاتی در ASP.NET Core هستند که مدیریت و پردازش ماژولار درخواست های HTTP را امکان پذیر می کنند. با دات نت، پیکربندی و استفاده از میان افزارها ساده و متمرکز شده است Program
کلاس
منبع اطلاعات
- مستندات رسمی مایکروسافت در مورد Middlewares در هسته ASP.NET
- مثال ها و بهترین روش ها در GitHub