آخرین نسخه چارچوب توسعه برنامه های کاربردی وب مایکروسافت، قابلیت های جدید و عالی را برای میان افزار، حداقل برنامه های API و موارد دیگر به ارمغان می آورد. در اینجا نکات برجسته است.
- میان افزار حافظه پنهان خروجی
- میان افزار محدود کننده نرخ
- درخواست میان افزار رفع فشرده سازی
- فیلترها در حداقل APIها
- پیوند پارامتر در روشهای عمل با استفاده از DI
- نتایج تایپ شده در حداقل APIها
- گروهها را در حداقل APIها مسیریابی کنید
- بررسی سلامت برای gRPC
- آپلودهای فایل در حداقل APIها
بخش عمدهای از نسخه .NET 7 “اصل ابری” مایکروسافت در ماه نوامبر، ASP.NET Core 7 ابزارهای جدید قدرتمندی را به چارچوب توسعه وب میآورد تا به توسعهدهندگان کمک کند تا برنامههای کاربردی وب مدرن ایجاد کنند. ASP.NET Core 7 که بر روی زمان اجرا .NET Core ساخته شده است، همه چیزهایی را که برای ایجاد رابط های کاربری وب پیشرفته و سرویس های پشتیبان قوی در Windows، Linux، و macOS نیاز دارید، دارد.
این مقاله به بزرگترین نکات برجسته در ASP.NET Core 7 میپردازد و شامل چند نمونه کد برای شروع کار با ویژگیهای جدید است. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در رایانه خود نصب کنید. اگر نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
اکنون بیایید به بهترین ویژگیهای جدید در ASP.NET Core 7 بپردازیم.
میان افزار ذخیره سازی خروجی
ASP.NET Core 7 به شما امکان می دهد از حافظه پنهان خروجی در تمام برنامه های ASP.NET Core استفاده کنید: برنامه های Minimal API، MVC، Razor Pages و Web API با کنترلرها. برای افزودن میانافزار ذخیرهسازی خروجی به مجموعه سرویسها، متد افزونه IServiceCollection.AddOutputCache را فراخوانی کنید. برای افزودن میانافزار به خط لوله پردازش درخواست، با روش توسعه IApplicationBuilder.UseOutputCache تماس بگیرید.
سپس، برای افزودن یک لایه کش به یک نقطه پایانی، میتوانید از کد زیر استفاده کنید.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Hello World!").CacheOutput(); app.Run();
میان افزار محدود کننده نرخ
کنترل سرعتی که کلاینتها میتوانند درخواستها را به نقاط پایانی ارسال کنند، یک اقدام امنیتی مهم است که به برنامههای کاربردی وب اجازه میدهد تا از حملات مخرب جلوگیری کنند. میتوانید از حملات انکار سرویس جلوگیری کنید، برای مثال، با محدود کردن تعداد درخواستهایی که از یک آدرس IP منفرد در یک دوره زمانی معین میشوند. اصطلاح این قابلیت محدود کردن نرخ است.
Microsoft.AspNetCore.RateLimiting در ASP.NET Core 7 می تواند به شما کمک کند تا محدودیت نرخ را در برنامه خود اعمال کنید. میتوانید سیاستهای محدودکننده نرخ را پیکربندی کنید و سپس آن خطمشیها را به نقاط پایانی متصل کنید، در نتیجه از آن نقاط پایانی در برابر حملات انکار سرویس محافظت کنید. این میان افزار به ویژه برای برنامه های کاربردی وب عمومی که در معرض چنین حملاتی هستند مفید است.
میتوانید با برنامههای ASP.NET Core Web ASP، ASP.NET Core MVC و ASP.NET Core Minimal API از میانافزار محدودکننده نرخ استفاده کنید. برای شروع استفاده از این میان افزار داخلی، بسته Microsoft.AspNetCore.RateLimiting NuGet را با اجرای دستور زیر در خط فرمان ویژوال استودیو به پروژه خود اضافه کنید.
dotnet add package Microsoft.AspNetCore.RateLimiting
همچنین، میتوانید این بسته را با اجرای دستور زیر در کنسول یا پنجره کنسول NuGet Package Manager به پروژه خود اضافه کنید:
Install-Package Microsoft.AspNetCore.RateLimiting
هنگامی که میان افزار محدود کننده نرخ نصب شد، قطعه کد ارائه شده در زیر را به فایل Program.cs خود اضافه کنید تا خدمات محدود کننده نرخ را با پیکربندی پیش فرض اضافه کنید.
builder.Services.AddRateLimiter(options => { });
درخواست میان افزار رفع فشرده سازی
ASP.NET Core 7 شامل یک میانافزار فشردهسازی درخواست جدید است که به نقاط پایانی اجازه میدهد درخواستهایی را بپذیرند که محتوای فشرده دارند. این امر نیاز به نوشتن کد به طور صریح برای از بین بردن درخواست های فشرده با محتوای فشرده را از بین می برد. با استفاده از هدر HTTP کدگذاری محتوا برای شناسایی و از حالت فشردهسازی محتوای فشرده در درخواستهای HTTP کار میکند.
در پاسخ به یک درخواست HTTP که با مقدار هدر Content-Encoding مطابقت دارد، میان افزار HttpRequest.Body را با استفاده از ارائه دهنده تطبیق در یک جریان فشرده سازی مناسب کپسوله می کند. به دنبال آن هدر Content-Encoding حذف می شود که نشان می دهد بدنه درخواست دیگر فشرده نشده است. توجه داشته باشید که میانافزار رفع فشردهسازی درخواست درخواستها را بدون هدر Content-Encoding نادیده میگیرد.
قطعه کد زیر نشان میدهد که چگونه میتوانید فشردهسازی درخواست را برای انواع پیشفرض Content-Encoding فعال کنید.
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRequestDecompression(); var app = builder.Build(); app.UseRequestDecompression(); app.MapPost("/", (HttpRequest httpRequest) => Results.Stream(httpRequest.Body)); app.Run();
فرمتهای فشردهسازی Brotli، Deflate و Gzip ارائهدهندههای پیشفرض رفع فشردهسازی هستند. مقادیر هدر Content-Encoding آنها به ترتیب br، deflate و gzip است.
فیلترها در حداقل APIها
فیلترها به شما امکان میدهند کد را در مراحل خاصی در خط لوله پردازش درخواست اجرا کنید. یک فیلتر قبل یا بعد از اجرای یک متد اکشن اجرا می شود. میتوانید از فیلترها برای ردیابی بازدیدهای صفحه وب یا اعتبارسنجی پارامترهای درخواست استفاده کنید. با استفاده از فیلترها، می توانید به جای نوشتن کد برای نگرانی های مقطعی در برنامه خود، بر منطق تجاری برنامه خود تمرکز کنید.
فیلتر نقطه پایانی شما را قادر میسازد تا مسائل مقطعی مانند مجوز، اعتبارسنجی و رسیدگی به استثنا را رهگیری، اصلاح، اتصال کوتاه و جمعآوری کنید. رابط جدید IEndpointFilter در ASP.NET Core 7 به ما امکان طراحی فیلترها و اتصال آنها به نقاط انتهایی API را می دهد. این فیلترها ممکن است اشیاء درخواست یا پاسخ یا پردازش درخواست اتصال کوتاه را تغییر دهند. یک فیلتر نقطه پایانی را می توان در اقدامات و در نقاط پایانی مسیر فراخوانی کرد.
واسط IEndpointFilter در فضای نام Microsoft.AspNetCore.Http مطابق شکل زیر تعریف شده است.
public interface IEndpointFilter { ValueTask<object?> InvokeAsync( EndpointFilterInvocationContext context, EndpointFilterDelegate next); }
قطعه کد زیر نشان میدهد که چگونه میتوان فیلترهای چند نقطه پایانی را به هم متصل کرد.
app.MapGet("/", () => { return "Demonstrating multiple endpoint filters."; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 1st filter."); var result = await next(endpointFilterInvocationContext); return result; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 2nd filter."); var result = await next(endpointFilterInvocationContext); return result; }) .AddEndpointFilter(async (endpointFilterInvocationContext, next) => { app.Logger.LogInformation("This is the 3rd Filter."); var result = await next(endpointFilterInvocationContext); return result; });
پیوند پارامتر در روشهای عمل با استفاده از DI
با ASP.NET Core 7، میتوانید از مزایای تزریق وابستگی برای اتصال پارامترها در روشهای عمل کنترلکنندههای API خود استفاده کنید. بنابراین، اگر نوع به عنوان یک سرویس پیکربندی شده است، دیگر نیازی به افزودن ویژگی [FromServices] به پارامترهای روش خود ندارید. قطعه کد زیر این را نشان می دهد.
[Route("[controller]")] [ApiController] public class MyDemoController : ControllerBase { public ActionResult Get(IDateTime dateTime) => Ok(dateTime.Now); }
نتایج تایپ شده در حداقل APIها
اینترفیس IResult در .NET 6 اضافه شد تا مقادیر بازگردانده شده از حداقل APIها را نشان دهد که از پشتیبانی ضمنی برای سریال JSON شیء برگشتی استفاده نمی کنند. در اینجا باید توجه داشت که کلاس Static Result برای ایجاد اشیاء Iresult مختلف که نشان دهنده انواع مختلف پاسخ ها هستند، مانند تنظیم کد وضعیت بازگشت یا تغییر مسیر کاربر به یک URL جدید استفاده می شود. با این حال، از آنجایی که انواع چارچوب بازگردانده شده از این روشها خصوصی بودند، نمیتوان نوع صحیح IR نتیجه را که از روشهای عمل برگردانده شده بود در طول آزمایش واحد تأیید کرد.
با .NET 7، انواع چارچوبی که رابط IResult را پیاده سازی می کنند اکنون عمومی هستند. بنابراین، همانطور که در قطعه کد ارائه شده در زیر نشان داده شده است، میتوانیم هنگام نوشتن تستهای واحد خود از اظهارات نوع استفاده کنیم.
[TestClass()] public class MyDemoApiTests { [TestMethod()] public void MapMyDemoApiTest() { var result = _MyDemoApi.GetAllData(); Assert.IsInstanceOfType(result, typeof(Ok<MyDemoModel[]>)); } }
همچنین میتوانید از انواع پیادهسازی IResult برای آزمایش واحد کنترلکنندههای مسیر خود در حداقل APIها استفاده کنید. قطعه کد زیر این را نشان می دهد.
var result = (Ok<MyModel>)await _MyDemoApi.GetAllData()
مسیریابی گروه ها در حداقل API ها
با ASP.NET Core 7، میتوانید از روش جدید افزونه MapGroup برای سازماندهی گروههایی از نقاط پایانی که یک پیشوند مشترک در حداقل APIهای شما دارند، استفاده کنید. روش توسعه MapGroup نه تنها کدهای تکراری را کاهش میدهد، بلکه سفارشیسازی کل گروههای نقاط پایانی را نیز آسانتر میکند.
قطعه کد زیر نحوه استفاده از MapGroup را نشان می دهد.
app.MapGroup("/public/authors") .MapAuthorsApi() .WithTags("Public");
قطعه کد بعدی روش توسعه MapAuthorsApi را نشان می دهد.
public static class MyRouteBuilder { public static RouteGroupBuilder MapAuthorsApi(this RouteGroupBuilder group) { group.MapGet("/", GetAllAuthors); group.MapGet("/{id}", GetAuthor); group.MapPost("/", CreateAuthor); group.MapPut("/{id}", UpdateAuthor); group.MapDelete("/{id}", DeleteAuthor); return group; } }
بررسی سلامت برای gRPC
ASP.NET Core از استفاده از میانافزار .NET Health Checks برای گزارش سلامت اجزای زیرساخت برنامه شما پشتیبانی میکند. ASP.NET Core 7 پشتیبانی داخلی را برای نظارت بر سلامت سرویس های gRPC از طریق بسته Grpc.AspNetCore.HealthChecks NuGet اضافه می کند. میتوانید از این بسته برای افشای یک نقطه پایانی در برنامه gRPC خود استفاده کنید که بررسی سلامت را فعال میکند.
توجه داشته باشید که معمولاً از بررسیهای بهداشتی با یک سیستم نظارت خارجی یا با متعادلکننده بار یا ارکستراتور کانتینر استفاده میکنید. مورد دوم ممکن است اقدامی مانند راه اندازی مجدد یا مسیریابی مجدد در اطراف سرویس را بر اساس وضعیت سلامت خودکار کند. میتوانید درباره بررسیهای سلامت هسته ASP.NET اینجا.
آپلودهای فایل در حداقل APIها
اکنون میتوانید از IFrmFile و IFormFileCollection در حداقل APIها برای آپلود فایلها در ASP.NET Core 7 استفاده کنید. قطعه کد زیر نحوه استفاده از IFrmFile را نشان میدهد.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapPost("/uploadfile", async (IFormFile iformFile) => { var tempFileName = Path.GetTempFileName(); using var fileStream = File.OpenWrite(tempFileName); await iformFile.CopyToAsync(fileStream); }); app.Run();
اگر می خواهید چندین فایل را آپلود کنید، می توانید به جای آن از کد زیر استفاده کنید.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapPost("/uploadfiles", async (IFormFileCollection files) => { foreach (var file in files) { var tempFileName = Path.GetTempFileName(); using var fileStream = File.OpenWrite(tempFileName); await file.CopyToAsync(fileStream); } }); app.Run();
از حافظه پنهان خروجی، محدود کردن نرخ و میانافزار فشردهسازی درخواست گرفته تا فیلترها، نقشههای مسیر و سایر قابلیتهای جدید برای حداقل APIها، ASP.NET Core 7 بسیاری از ویژگیهای جدید را در اختیار توسعهدهندگان قرار میدهد که ساختن قویتر را بسیار آسانتر و سریعتر میکند. برنامه های کاربردی وب ASP.NET Core 7 توسعه سریعتر را با استفاده از مؤلفههای مدولار امکانپذیر میکند، عملکرد و مقیاسپذیری بهتری را در چندین پلتفرم ارائه میدهد و استقرار در میزبانهای وب، Docker، Azure و سایر محیطهای میزبانی را با ابزار داخلی ساده میکند.
در این مقاله ما فقط برخی از ویژگیهای مهم جدید در ASP.NET Core 7 را مورد بحث قرار دادهایم – انتخابهای برتر من. لیست کامل ویژگی های جدید را می توانید در ASP.NET Core 7 پیدا کنید اینجا.
پست های مرتبط
بهترین ویژگی های جدید در ASP.NET Core 7
بهترین ویژگی های جدید در ASP.NET Core 7
بهترین ویژگی های جدید در ASP.NET Core 7