ویژگی‌ های جدید ASP.NET Core 5.0
ایمان مدائنی

در این مقاله مهم‌ترین تغییرات در ASP.NET Core 5.0 را بررسی می‌کنیم.

بهبود ASP.NET Core MVC و Razor

Model binding DateTime به عنوان UTC

Model binding از بایند کردن UTC time strings به DateTime پشتیبانی می‌کند. اگر درخواست شامل UTC time string باشد، مدل بایندینگ آن را به UTC DateTime بایند می‌کند.

Model binding و اعتبارسنجی  با C# 9 record types

C# 9 record types می‌تواند با مدل بایندینگ در MVC controller یا Razor Page استفاده شود. Record types یک روش خوب برای دیتا مدل‌هایی است که از طریق شبکه منتقل می‌شوند. مثلا PersonController از Person record type  با مدل بایندینگ و form validation استفاده می‌کند:

public record Person([Required] string Name, [Range(0, 150)] int Age);

public class PersonController
{
   public IActionResult Index() => View();

   [HttpPost]
   public IActionResult Index(Person person)
   {
          // ...
   }
}

 

فایل Person/Index.cshtml:

 

@model Person

Name: <input asp-for="Model.Name" />
<span asp-validation-for="Model.Name" />

Age: <input asp-for="Model.Age" />
<span asp-validation-for="Model.Age" />

 

بهبود DynamicRouteValueTransformer

DynamicRouteValueTransformer ،ASP.NET Core 3.1 را به عنوان روشی برای استفاده از endpoint سفارشی معرفی کرد تا به صورت داینامیک MVC controller action یا Razor page را انتخاب کند. برنامه‌های ASP.NET Core 5.0 می‌توانند وضعیت را به DynamicRouteValueTransformer ارسال کرده و مجموعه endpoint های انتخابی را فیلتر کنند.

Web API

OpenAPI Specification پیش‌فرض

OpenAPI Specification یک استاندارد صنعتی برای توصیف HTTP APIs و ادغام آن‌ها در فرآیندهای پیچیده تجاری یا موارد شخص ثالث است. OpenAPI به طور گسترده توسط تمام providerهای ابری (cloud) و بسیاری از APIها پشتیبانی می‌شود. برنامه‌هایی که مستندات OpenAPI را از web APIs منتشر می‌کنند دارای فرصت‌های جدید متنوعی هستند که می‌توان از این APIs استفاده کرد. در مشارکت با نگهدارندگان پروژه منبع باز Swashbuckle.AspNetCore، قالب ASP.NET Core API شامل وابستگی‌های NuGet بر روی Swashbuckle است. Swashbuckle یک پکیج NuGet منبع باز محبوب است که مستندات OpenAPI را به صورت داینامیک منتشر می‌کند. Swashbuckle این کار را با مشاهده API controllerها و تولید داکیومنت OpenAPI در زمان اجرا، یا در زمان ساخت با استفاده از Swashbuckle CLI انجام می‌دهد.

در ASP.NET Core 5.0، قالب‌های web API به طور پیش‌فرض پشتیبانی OpenAPI را فعال می‌کنند. برای غیر فعال کردن OpenAPI:

از خط فرمان (command line):

 

dotnet new webapi --no-openapi true

 

از ویژوال استودیو: برداشتن تیک Enable OpenAPI support

همه فایل‌های csproj. ایجاد شده برای پروژه‌های web API شامل رفرنس به پکیج Swashbuckle.AspNetCore NuGet هستند.

 

<ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.5.1" />
</ItemGroup>

 

کد تولید شده قالب شامل کد در Startup.ConfigureServices است که تولید داکیومنت OpenAPI  را فعال می‌کند:

public void ConfigureServices(IServiceCollection services)
{

    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApp1", Version = "v1" });
    });
}

 

متد Swashbuckle middleware ،Startup.Configure  را اضافه می‌کند که این موارد را فعال می‌کند:

1. فرآیند تولید داکیومنت

2. صفحه Swagger UI پیش‌فرض در حالت development

کد تولید شده قالب به طور تصادفی هنگام انتشار برای production، توضیحات API را در معرض نمایش قرار نمی‌دهد.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json",
                         "WebApp1 v1"));
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

 

ایمپورت Azure API Management

وقتی پروژه‌های OpenAPI ،ASP.NET Core API  را فعال می‌کنند، ویژوال استودیو 2019 ورژن 16.8 و نسخه‌های بعدی به طور خودکار یک مرحله اضافی را در جریان انتشار ارائه می‌دهد. توسعه‌دهندگانی که از Azure API Management استفاده می‌کنند این فرصت را دارند که در طی جریان پابلیش، به صورت خودکار APIs را درون Azure API Management ایمپورت کنند:

 

تجربه بهتر راه‌اندازی برای پروژه‌های web API

با فعال بودن OpenAPI به طور پیش‌فرض، تجربه راه‌اندازی برنامه (F5) برای توسعه‌دهندگان web API به طور قابل توجهی بهبود یافته است. با ASP.NET Core 5.0، قالب web API از قبل کانفیگ شده است تا صفحه Swagger UI لود شود. صفحه Swagger UI هم مستندات اضافه شده به API پابلیش شده را ارائه می‌دهد، و هم تست کردن APIها تنها با یک کلیک را امکان‌پذیر می‌سازد.

 

Blazor

بهبود عملکرد

برای NET 5.، با تمرکز ویژه بر رندرینگ رابط کاربری پیچیده و JSON serialization، پیشرفت قابل توجهی در عملکرد زمان اجرای Blazor WebAssembly ایجاد شده است. در تست‌های عملکردی، Blazor WebAssembly در NET 5. برای اکثر سناریوها دو تا سه برابر سریع‌تر شده است.

جداسازی CSS

اکنون Blazor تعریف استایل‌های CSS را پشتیبانی می‌کند که محدود به یک کامپوننت خاص هستند. استایل‌های CSS مختص کامپوننت، استدلال در مورد استایل‌های موجود در برنامه و جلوگیری از اثرات جانبی ناخواسته استایل‌های سراسری را آسان می‌سازد.

کامپوننت جدید InputFile

کامپوننت InputFile امکان خواندن یک یا چند فایل انتخاب شده توسط کاربر برای آپلود را فراهم می‌کند.

مجازی‌سازی کامپوننت

با استفاده از پشتیبانی مجازی‌سازی داخلی فریم‌ورک Blazor، درک عملکرد رندرینگ کامپوننت بهبود یافته است.

پشتیبانی از رویداد ontoggle

اکنون رویدادهای Blazor از رویداد ontoggle DOM پشتیبانی می‌کنند.

ست کردن UI focus در برنامه‌های Blazor

استفاده از متد FocusAsync بر روی عناصر تا UI focus بر روی عناصر ست شود.

اتربیوت‌های سفارشی اعتبارسنجی‌ها

کلاس‌های اعتبارسنجی‌ سفارشی وقتی با فریم‌ورک‌های CSS مانند بوت‌استرپ ادغام می‌شوند مفید هستند.

پشتیبانی از IAsyncDisposable

اکنون کامپوننت‌های Blazor از اینترفیس IAsyncDisposable برای انتشار ناهمزمان منابع تخصیص‌یافته پشتیبانی می‌شوند.

جداسازی جاوااسکریپت

Blazor جداسازی جاوااسکریپت را در ماژول‌های استاندارد جاوااسکریپت امکان‌پذیر می‌سازد.

کامپوننت‌های فرم از display name پشتیبانی می‌کنند

کامپوننت‌های داخلی زیر از نمایش نام‌ها با پارامتر DisplayName پشتیبانی می‌کنند:

InputDate

InputNumber

InputSelect

gRPC

بسیاری از بهبودهای عملکردی در gRPC ساخته شده‌اند.

SignalR

فیلترهای SignalR Hub

فیلترهای SignalR Hub، به نام Hub pipelines در ASP.NET SignalR، ویژگیی است که به کد اجازه می‌دهد قبل و بعد از متدهای Hub فراخوانی شده اجرا شود. اجرای کد قبل و بعد از متدهای Hub که فراخوانی می‌شوند شبیه به روشی است که middleware می‌تواند کد را قبل و بعد از HTTP request اجرا کند. استفاده معمول شامل لاگ انداختن، مدیریت خطا، و اعتبارسنجی آرگومان است.

فراخوانی SignalR parallel hub

ASP.NET Core SignalR اکنون قادر به مدیریت فراخوانی parallel hub است. رفتار پیش‌فرض را می‌توان تغییر داد تا به کلاینت‌ها اجازه داده شود همزمان بیش از یک متد hub را فراخوانی کنند:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(options =>
    {
        options.MaximumParallelInvocationsPerClient = 5;
    });
}

افزودن پشتیبانی Messagepack در SignalR Java client

یک پکیج جدید، com.microsoft.signalr.messagepack، پشتیبانی MessagePack را برای SignalR Java client اضافه کرده است. برای استفاده از  withHubProtocol(new MessagePackHubProtocol()) ،MessagePack hub protocol. را به connection builder اضافه کنید:

HubConnection hubConnection = HubConnectionBuilder.create(
                           "http://localhost:53353/MyHub")
               .withHubProtocol(new MessagePackHubProtocol())
               .build();

Kestrel

Endpointهای قابل ری‌لود شدن از طریق کانفیگ: Kestrel می‌تواند تغییرات کانفیگ ارسال شده به KestrelServerOptions.Configure را تشخیص دهد و از endpointهای موجود رها کند و به endpointهای جدید متصل کند بدون اینکه وقتی پارامتر true ،reloadOnChange است نیاز به ریستارت برنامه باشد. به طور پیش‌فرض هنگام استفاده از ConfigureWebHostDefaults یا CreateDefaultBuilder، Kestrel با فعال کردن reloadOnChange به زیر بخش کانفیگ " Kestrel" بایند می‌شود. برنامه‌ها باید وقتی که KestrelServerOptions.Configure به صورت دستی فراخوانی می‌شود reloadOnChange: true را ارسال کنند تا endpointهای قابل ری‌لود شدن را دریافت کنند.

بهبود HTTP/2 response headers.

پشتیبانی از انواع endpointهای دیگر در انتقال سوکت‌ها: افزودن به API جدیدی که در System.Net.Sockets معرفی شده است، انتقال سوکت‌ها در Kestrel امکان اتصال به مدیریت فایل‌های موجود و سوکت‌های دامین Unix را فراهم می‌کند. پشتیبانی از اتصال به مدیریت فایل‌های موجود امکان استفاده از یکپارچه‌سازی Systemd موجود را بدون نیاز به حمل و نقل libuv فراهم می‌کند.

گزینه‌های مخصوص endpoint برای Kestrel از طریق configuration

پشتیبانی برای کانفیگ گزینه‌های مخصوص endpoint برای Kestrel از طریق configuration اضافه شده است. کانفیگ این endpointها شامل موارد زیر است:

پروتکل‌های HTTP استفاده شده

پروتکل‌های TLS استفاده شده

Certificate انتخاب شده

Client certificate mode

کانفیگ اجازه می‌دهد مشخص کنیم کدام certificate بر اساس نام سرور مشخص شده انتخاب شده است. نام سرور بخشی از اکستنشن Server Name Indication (SNI) به پروتکل TLS است که توسط کلاینت نشان داده شده است.

مثال زیر نحوه تعیین گزینه‌های مخصوص endpoint را با استفاده از فایل configuration نشان می‌دهد:

{
  "Kestrel": {
    "Endpoints": {
      "EndpointName": {
        "Url": "https://*",
        "Sni": {
          "a.example.org": {
            "Protocols": "Http1AndHttp2",
            "SslProtocols": [ "Tls11", "Tls12"],
            "Certificate": {
              "Path": "testCert.pfx",
              "Password": "testPassword"
            },
            "ClientCertificateMode" : "NoCertificate"
          },
          "*.example.org": {
            "Certificate": {
              "Path": "testCert2.pfx",
              "Password": "testPassword"
            }
          },
          "*": {
            // At least one sub-property needs to exist per
            // SNI section or it cannot be discovered via
            // IConfiguration
            "Protocols": "Http1",
          }
        }
      }
    }
  }
}

Server Name Indication (SNI) یک اکستنشن TLS است که شامل یک دامین مجازی به عنوان بخشی از SSL negotiation است. این به این معناست که نام دامین مجازی، یا hostname، می‌تواند برای شناسایی end point شبکه استفاده شود.

کانتینرها

قبل از NET 5.0.، ساخت و انتشار Dockerfile برای برنامه‌های ASP.NET Core نیاز به گرفتن کل NET Core SDK. و ایمیج ASP.NET Core دارد. با این انتشار، گرفتن بایت‌های ایمیج‌های SDK کاهش می‌یابد و بایت‌های گرفته شده برای ایمیج ASP.NET Core تا حد زیادی حذف شده است.

Azure Active Directory authentication با Microsoft.Identity.Web

قالب‌های پروژه ASP.NET Core اکنون با Microsoft.Identity.Web ادغام شده است تا احراز هویت را با Azure Activity Directory (Azure AD) مدیریت کند. Microsoft.Identity.Web package این موارد را ارائه می‌دهد:

تجربه بهتر برای احراز هویت از طریق Azure AD

راهی آسان‌تر برای دسترسی به منابع Azure از طرف کاربران خود، از جمله Microsoft Graph.

اجازه دسترسی anonymous به یک endpoint

اکستنشن متد AllowAnonymous اجازه دسترسی anonymous به endpoint را می‌دهد:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        })
        .AllowAnonymous();
    });
}

JSON Console Logger

علاوه بر پشتیبانی ازformatter های سفارشی، ما همچنین می‌توانیم JSON formatter داخلی را اضافه کنیم که لاگ‌های JSON ساخت‌یافته‌ای را برای کنسول منتشر می‌کند. کد زیر نحوه تغییر از لاگر پیش‌فرض به JSON را نشان می‌دهد:

public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
  .ConfigureLogging(logging =>
  {
     logging.AddJsonConsole(options =>
     {
         options.JsonWriterOptions = new JsonWriterOptions()
         { Indented = true };
     });
  })
  .ConfigureWebHostDefaults(webBuilder =>
  {
    webBuilder.UseStartup<Startup>();
  });

پیام‌های لاگ منتشر شده برای کنسول با فرمت JSON هستند:

{
  "EventId": 0,
  "LogLevel": "Information",
  "Category": "Microsoft.Hosting.Lifetime",
  "Message": "Now listening on: https://localhost:5001",
  "State": {
    "Message": "Now listening on: https://localhost:5001",
    "address": "https://localhost:5001",
    "{OriginalFormat}": "Now listening on: {address}"
  }
}

جمع‌بندی

در این مقاله سعی کردیم بخشی از مهم‌ترین ویژگی‌های افزوده شده به ASP.NET Core 5.0 را بررسی کنیم. ASP.NET Core 5.0 علاوه بر مواردی که در بالا ذکر شد شامل تغییرات خوب و جدید دیگری نظیر رفرش خودکار با dotnet watch، کنترل فعال‌سازی کلاس Startup، اکستنشن متد JSON برای HttpRequest و HttpResponse، اعمال اتربیوت [Compare] بر روی پراپرتی‌ها در مدل Razor Page و موارد دیگر می‌باشد.

نظرات کاربران در رابطه با این دوره

جهت ثبت نظر باید در سایت عضو شوید و یا وارد سایت شده باشید .
logo-samandehi