The .NET 7 release marks an exciting milestone in many ways, but one in particular that’s exciting for ASP.NET developers building distributed apps or apps designed to be cloud native and ready for dynamic horizontal scale out is the addition of the Orleans team to the broader .NET team. Bringing Orleans and ASP.NET Core closer together has led to some exciting ideas for the future of how we blend Orleans into the ASP.NET toolchain, and coupled with the huge advances in performance throughout .NET 7 are improvements to Orleans 7 that bring over 150% improvements to some areas of the Orleans toolchain. This post will introduce you to some of the new features in Orleans 7.
اشتراکها
- EF -> WCF Data Service -> SSRS via XML
- Data Processing Extension
- Using SSRS In ASP.NET MVC Application
- Microsoft.Reporting.WebForms.ReportDataSource
- Data Processing Extension
- Using SSRS In ASP.NET MVC Application
- Microsoft.Reporting.WebForms.ReportDataSource
نظرات مطالب
ASP.NET MVC #1
فقط در زمان اولین بارگذاری برنامه در حافظه و اجرای اولیه آن.
برای این مساله هم در IISهای جدید فکری شده:
Auto-Start ASP.NET Applications
Application Initialization Module
IIS 8.0 Application Initialization
ASP.NET App Suspend – responsive shared .NET web hosting
برای این مساله هم در IISهای جدید فکری شده:
Auto-Start ASP.NET Applications
Application Initialization Module
IIS 8.0 Application Initialization
ASP.NET App Suspend – responsive shared .NET web hosting
اشتراکها
دریافت NET Core 3 - Minibook.
The people from InfoQ released a free (mini)book about .NET Core. In this book, five authors talk about the current state of .NET Core 3.0 from multiple perspectives. Each author brings their experience and ideas on how different .NET Core 3.0 features are relevant to the .NET ecosystem, both present and future.
اشتراکها
لیستی از APIهای جدید NET Core 3.0.
IdentityServer با سایر زبانها هم کار میکند؛ چون یک پروتکل استاندارد را پیاده سازی کردهاست و این پروتکل برای انواع و اقسام زبانهای موجود دارای کلاینت است: کلاینت و مثال جاوا، کلاینت پایتون و سایر کلاینتهای تائید شده و یا اگر مخزن کد آنرا بررسی کنید هر آنچه که نگارش 3
دارد و الان آرشیو شده و دیگر پشتیبانی نمیشود، مختص به MVC 5x است. اما
چون نگارش 3 و یا 4 و یا n آن، پروتکل استاندارد OpenID Connect را پیاده
سازی میکنند، یک کلاینت MVC 5x و یا یک کلاینت PHP هم میتواند از آن استفاده کند. یعنی همان مثالهای MVC 5x آن با نگارش 4 هم کار میکنند.
The .NET 6 solution to this is the new DbBatch class. The goals in the Batching API proposal are;
- Provide a structured way to execute multiple SQL statements in a single roundtrip, without any need for client-side parsing of SQL.
در طی سالهای قبل، نحوهی آغاز برنامههای ASP.NET Core دچار تغییرات زیادی شدهاست که حداقل سه مورد مهم آنها به صورت زیر است:
- استفاده از WebHost.CreateDefaultBuilder: این روش جهت تنظیم شروع به کار یک برنامهی ASP.NET Core 2x مورد استفاده قرار میگرفت.
- استفاده از Host.CreateDefaultBuilder: روش پیشفرض آغاز برنامههای وب NET Core 3x. و NET 5x. که با معرفی generic host، امکان تهیهی Worker services را میسر کردند.
- استفاده از WebApplication.CreateBuilder: روش جدید شروع به کار با برنامههای وب مبتنی بر NET 6.
استفاده از WebHost.CreateDefaultBuilder در ASP.NET Core 2.x
در نگارش اول ASP.NET Core، مفهومی به نام هاست پیشفرض (default host) وجود نداشت. یکی از مهمترین نکات درنظر گرفته شده در طراحی ASP.NET Core، مفهوم «هزینه کردن به ازای احتیاج» است. یعنی اگر نیاز به قابلیتی نیست، نباید وجود داشته باشد. به این ترتیب یک قالب آغازین نباید به همراه تعداد زیادی بستههای NuGet و مقدار زیادی کد برای تنظیم باشد؛ زمانیکه واقعا قرار نیست از تمام آنها استفاده شود. به همین جهت از نگارش 2، شروع به سادهکردن این قالب اولیه کردند و در این زمان، WebHost.CreateDefaultBuilder ارائه شد. این تنظیم به ظاهر ساده، کدهای پیشفرض مورد نیاز قابل توجهی را جهت ساخت سادهی IWebHostBuilder و IWebHost به همراه دارد. در قالب به همراه آن، بین مفاهیم تنظیمات application و host تفاوت قائل شدهاند؛ یعنی دو فایل Program.cs را برای تنظیمات application و فایل Startup.cs را برای ارائهی تنظیمات هاست، تدارک دیدند.
در این طراحی، بین میدان دید Program و Startup تفاوت وجود دارد. هدف از Program، ارائهی تنظیمات زیرساختی برنامه، مانند تنظیمات HTTP Server، یکپارچگی با IIS و امثال آن شد و عموما در طول عمر برنامه ثابت است. اما برای تغییر رفتار برنامه، بیشتر تغییرات و تنظیمات، به Startup محول شدند؛ مانند تنظیمات تزریق وابستگیها، تنظیمات میانافزارها، مسیریابیها و غیره.
نمونهای از فایل Program.cs برنامههای ASP.NET Core 2x را در اینجا ملاحظه میکنید این تنظیم ساده، کار خواندن فایل appsettings.json و برپایی تنظیمات برنامه، تنظیمات logging و همچنین تنظیمات یکپارچگی با Kestrel/IIS را در پشت صحنه انجام میدهد. همچنین ارجاعی را نیز به کلاس Startup برنامه دارد. متد UseStartup به صورت خودکار به دنبال متدهای ویژهی ConfigureServices و Configure در کلاس آغازین برنامه گشته و آنها را فراخوانی میکند تا تنظیمات تزریق وابستگیها، مسیریابیها و میانافزارها صورت گیرند.
معرفی Generic Host در ASP.NET Core 3.x/5
ASP.NET Core 3.x به همراه تغییرات بزرگی در کدهای آغازین برنامههای ASP.NET Core بود. تا پیش از آن، امکانات پایهی ASP.NET Core تنها برای مقاصد وب قابل استفاده بود. اما در نگارشهای 3x، با ارائهی یک هاست عمومی، امکان پشتیبانی از سایر برنامهها، مانند worker services را نیز میسر کرد؛ برای مثال پیشتیبانی از کارهای طولانی پس زمینه، هاست سرویسهای gRPC، هاست سرویسهای ویندوز و غیره. هدف اصلی از این تغییرات، به اشتراک گذاری فریمورک پایهی ASP.NET Core که تنها برای برنامههای وب ساخته شده بود و به همراه امکاناتی مانند تنظیمات، ثبت وقایع، تزریق وابستگیها و غیره بود، با سایر انواع برنامههای یاد شده است. برای رسیدن به این هدف، Web Host نگارش 2x، به Generic Host نگارش 3x تغییر کرد و سپس ASP.NET Core برفراز آن بنا شد. اینبار بجای IWebHostBuilder، نمونهی جدید IHostBuilder را داریم:
در اینجا نمونهای از فایل Program.cs برنامههای ASP.NET Core 3x را ملاحظه میکنید. با توجه به عمومی بودن این روش، قسمت ConfigureWebHostDefaults آن، همان کار WebHost.CreateDefaultBuilder نگارش 2 ASP.NET Core را انجام میدهد.
ASP.NET Core 5 به همراه تغییرات مهمی در این زمینه نبود و تنها با تغییر target framework در فایل csproj و به روز رسانی بستههای نیوگت مرتبط، کار ارتقاء به نگارش جدید در آن صورت میگرفت.
معرفی WebApplicationBuilder در ASP.NET Core 6x
در دات نت 6، روش آغاز برنامههای وب بطور کامل تغییر کردهاست. در تمام نگارشهای پیشین ASP.NET Core، همواره شاهد دو فایل Program.cs و Startup.cs بودیم؛ اما در اینجا فقط یک فایل Program.cs بیشتر وجود ندارد. هر چند همانطور که در مطلب «ارتقاء فایلهای آغازین برنامههای ASP.NET Core 5x به 6x» نیز عنوان شد، میتوان همان سبک و سیاق پیشین را نیز برگرداند و از این لحاظ محدودیتی وجود ندارد.
در اینجا نمونهای از فایل Program.cs برنامههای دات نت 6 را مشاهده میکنید که تغییرات قابل ملاحظهای داشتهاست:
- استفاده از top level statements
- استفاده از usingهای سراسری و سایر قابلیتهای C# 10.0
- حذف کامل کلاس Startup؛ اینبار همه چیز فقط یک فایل است.
دیدگاهی را که در اینجا بکار گرفتهاند شامل این موارد است و بیشتر تازهواردان را مدنظر دارند:
- برای شروع به کار، using statements اضافی هستند؛ پس حذف شدهاند!
- برای شروع به کار، namespaces اضافی هستند؛ پس حذف شدهاند!
- برای شروع به کار، Program.Main ... هم اضافی است!
- تنظیمات بین دو فایل Program.cs و Startup.cs تقیسم نشدهاند و همهچیز یکجا است و این هم نیازی به توضیح اضافی به تازهواردان، ندارد.
- همچنین همانطور که عنوان شد، « ... متد UseStartup به صورت خودکار به دنبال متدهای ویژهی ConfigureServices و Configure در کلاس آغازین برنامه گشته و آنها را فراخوانی میکند تا تنظیمات تزریق وابستگیها، مسیریابیها و میانافزارها صورت گیرند ...»
نکتهی مهم این توضیح، این است که کلاس Startup، هیچ اینترفیسی را پیاده سازی نمیکند. یعنی نام این متدها، دقیقا باید به همین صورت باشند (بدون اینکه قرار دادی توسط یک اینترفیس برای آنها وضع شده باشد) و ... چرا واقعا باید به این صورت باشد؟! به همین جهت اینها هم حذف شدهاند!
- در اینجا WebApplication هم مشاهده میشود؛ اما آیا واقعا نیازی به آن است؟
پاسخ: خیر! WebApplication.CreateBuilder ای که در اینجا ملاحظه میکنید در حقیقت ساده شدهی قطعه کد زیر از کدهای ASP.NET Core 3x/5x است:
که ... WebApplication.CreateBuilder بدون شک سادهتر از قطعه کد فوق است. همچنین پس از یک سطر زیر:
با استفاده از خاصیت builder.Configuration، میتوان به تنظیمات برنامه دسترسی یافت و یا با استفاده از builder.Services میتوان سرویسهای جدیدی را ثبت کرد:
و یا با استفاده از خاصیت builder.Logging میتوان تنظیمات ثبت وقایع برنامه را تغییر داد:
همچنین در اینجا زمانیکه کار تنظیمات به پایان رسید، نمونهای از WebApplication را به صورت زیر تولید کرده:
و اکنون میتوان تنظیمات میانافزارها و یا مسیریابیها را انجام داد:
که در مقایسه با نگارشهای قبلی، بسیار سادهتر شده، هرچند مرز بین اینها و ترتیب آنها اندکی کمرنگتر شدهاست.
- استفاده از WebHost.CreateDefaultBuilder: این روش جهت تنظیم شروع به کار یک برنامهی ASP.NET Core 2x مورد استفاده قرار میگرفت.
- استفاده از Host.CreateDefaultBuilder: روش پیشفرض آغاز برنامههای وب NET Core 3x. و NET 5x. که با معرفی generic host، امکان تهیهی Worker services را میسر کردند.
- استفاده از WebApplication.CreateBuilder: روش جدید شروع به کار با برنامههای وب مبتنی بر NET 6.
استفاده از WebHost.CreateDefaultBuilder در ASP.NET Core 2.x
در نگارش اول ASP.NET Core، مفهومی به نام هاست پیشفرض (default host) وجود نداشت. یکی از مهمترین نکات درنظر گرفته شده در طراحی ASP.NET Core، مفهوم «هزینه کردن به ازای احتیاج» است. یعنی اگر نیاز به قابلیتی نیست، نباید وجود داشته باشد. به این ترتیب یک قالب آغازین نباید به همراه تعداد زیادی بستههای NuGet و مقدار زیادی کد برای تنظیم باشد؛ زمانیکه واقعا قرار نیست از تمام آنها استفاده شود. به همین جهت از نگارش 2، شروع به سادهکردن این قالب اولیه کردند و در این زمان، WebHost.CreateDefaultBuilder ارائه شد. این تنظیم به ظاهر ساده، کدهای پیشفرض مورد نیاز قابل توجهی را جهت ساخت سادهی IWebHostBuilder و IWebHost به همراه دارد. در قالب به همراه آن، بین مفاهیم تنظیمات application و host تفاوت قائل شدهاند؛ یعنی دو فایل Program.cs را برای تنظیمات application و فایل Startup.cs را برای ارائهی تنظیمات هاست، تدارک دیدند.
در این طراحی، بین میدان دید Program و Startup تفاوت وجود دارد. هدف از Program، ارائهی تنظیمات زیرساختی برنامه، مانند تنظیمات HTTP Server، یکپارچگی با IIS و امثال آن شد و عموما در طول عمر برنامه ثابت است. اما برای تغییر رفتار برنامه، بیشتر تغییرات و تنظیمات، به Startup محول شدند؛ مانند تنظیمات تزریق وابستگیها، تنظیمات میانافزارها، مسیریابیها و غیره.
public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); }
معرفی Generic Host در ASP.NET Core 3.x/5
ASP.NET Core 3.x به همراه تغییرات بزرگی در کدهای آغازین برنامههای ASP.NET Core بود. تا پیش از آن، امکانات پایهی ASP.NET Core تنها برای مقاصد وب قابل استفاده بود. اما در نگارشهای 3x، با ارائهی یک هاست عمومی، امکان پشتیبانی از سایر برنامهها، مانند worker services را نیز میسر کرد؛ برای مثال پیشتیبانی از کارهای طولانی پس زمینه، هاست سرویسهای gRPC، هاست سرویسهای ویندوز و غیره. هدف اصلی از این تغییرات، به اشتراک گذاری فریمورک پایهی ASP.NET Core که تنها برای برنامههای وب ساخته شده بود و به همراه امکاناتی مانند تنظیمات، ثبت وقایع، تزریق وابستگیها و غیره بود، با سایر انواع برنامههای یاد شده است. برای رسیدن به این هدف، Web Host نگارش 2x، به Generic Host نگارش 3x تغییر کرد و سپس ASP.NET Core برفراز آن بنا شد. اینبار بجای IWebHostBuilder، نمونهی جدید IHostBuilder را داریم:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }; } }
ASP.NET Core 5 به همراه تغییرات مهمی در این زمینه نبود و تنها با تغییر target framework در فایل csproj و به روز رسانی بستههای نیوگت مرتبط، کار ارتقاء به نگارش جدید در آن صورت میگرفت.
معرفی WebApplicationBuilder در ASP.NET Core 6x
در دات نت 6، روش آغاز برنامههای وب بطور کامل تغییر کردهاست. در تمام نگارشهای پیشین ASP.NET Core، همواره شاهد دو فایل Program.cs و Startup.cs بودیم؛ اما در اینجا فقط یک فایل Program.cs بیشتر وجود ندارد. هر چند همانطور که در مطلب «ارتقاء فایلهای آغازین برنامههای ASP.NET Core 5x به 6x» نیز عنوان شد، میتوان همان سبک و سیاق پیشین را نیز برگرداند و از این لحاظ محدودیتی وجود ندارد.
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.MapGet("/", () => "Hello World!"); app.MapRazorPages(); app.Run();
- استفاده از top level statements
- استفاده از usingهای سراسری و سایر قابلیتهای C# 10.0
- حذف کامل کلاس Startup؛ اینبار همه چیز فقط یک فایل است.
دیدگاهی را که در اینجا بکار گرفتهاند شامل این موارد است و بیشتر تازهواردان را مدنظر دارند:
- برای شروع به کار، using statements اضافی هستند؛ پس حذف شدهاند!
- برای شروع به کار، namespaces اضافی هستند؛ پس حذف شدهاند!
- برای شروع به کار، Program.Main ... هم اضافی است!
- تنظیمات بین دو فایل Program.cs و Startup.cs تقیسم نشدهاند و همهچیز یکجا است و این هم نیازی به توضیح اضافی به تازهواردان، ندارد.
- همچنین همانطور که عنوان شد، « ... متد UseStartup به صورت خودکار به دنبال متدهای ویژهی ConfigureServices و Configure در کلاس آغازین برنامه گشته و آنها را فراخوانی میکند تا تنظیمات تزریق وابستگیها، مسیریابیها و میانافزارها صورت گیرند ...»
نکتهی مهم این توضیح، این است که کلاس Startup، هیچ اینترفیسی را پیاده سازی نمیکند. یعنی نام این متدها، دقیقا باید به همین صورت باشند (بدون اینکه قرار دادی توسط یک اینترفیس برای آنها وضع شده باشد) و ... چرا واقعا باید به این صورت باشد؟! به همین جهت اینها هم حذف شدهاند!
- در اینجا WebApplication هم مشاهده میشود؛ اما آیا واقعا نیازی به آن است؟
پاسخ: خیر! WebApplication.CreateBuilder ای که در اینجا ملاحظه میکنید در حقیقت ساده شدهی قطعه کد زیر از کدهای ASP.NET Core 3x/5x است:
var hostBuilder = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddRazorPages(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.Configure((ctx, app) => { if (ctx.HostingEnvironment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", () => "Hello World!"); endpoints.MapRazorPages(); }); }); }); hostBuilder.Build().Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages(); builder.Services.AddSingleton<MyThingy>();
builder.Logging.AddFile();
var app = builder.Build();
app.UseStaticFiles(); app.MapRazorPages();