‫۶ سال و ۷ ماه قبل، شنبه ۱۴ بهمن ۱۳۹۶، ساعت ۱۳:۳۱
ارتقاء به ASP.NET Core 2.1

در ASP.NET Core 2.1 بجای متدهای Html.Partial vs Html.RenderPartial, sync vs async برای رندر partial views می‌توان از Tag helper جدید partial استفاده کرد:
<partial name="_ProductPartial" asp-for="@Model[i]" />
که در اینجا name به فایل ProductPartial.cshtml_ اشاره می‌کند و مقدار مدل آن نیز مشخص شده‌است.
‫۶ سال و ۷ ماه قبل، شنبه ۱۴ بهمن ۱۳۹۶، ساعت ۱۲:۴۵
یک نکته‌ی تکمیلی

به همراه NET Core 2.1.، یک HttpClientFactory توکار توسط مایکروسافت ارائه شده‌است:

به این ترتیب برای مثال جهت کار با یک آدرس مشخص، می‌توان تنظیمات آن‌را یکبار در آغاز برنامه ثبت کرد:
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient("github", c =>
    {
        c.BaseAddress = new Uri("https://api.github.com/");
        c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); // Github requires a user-agent
    });
    services.AddHttpClient();
}
و بعد برای استفاده‌ی سراسری از آن توسط سیستم ترزیق وابستگی‌ها، می‌توان به صورت زیر عمل کرد:
IHttpClientFactory _httpClientFactory;
public MyController(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}
public IActionResult Index()
{
    //This client doesn’t have any special configuration applied
    var defaultClient = _httpClientFactory.CreateClient();
    //This client has the header and base address configured for the “github” client above.
    var gitHubClient = _httpClientFactory.CreateClient("github");
    return View();
}
‫۶ سال و ۷ ماه قبل، شنبه ۱۴ بهمن ۱۳۹۶، ساعت ۱۲:۳۰
بهبود کارآیی برنامه‌های ASP.NET Core 2.1 هاست شده‌ی در IIS

تا پیش از نگارش 2.1، تمام درخواست‌های رسیده‌ی به IIS توسط یک پروکسی معکوس به نام ASP.NET Core Module به Kestrel ارسال می‌شدند:


در نگارش 2.1، می‌توان کل برنامه را داخل IIS worker process یا همان w3wp.exe هاست کرد تا تاثیر منفی این پروکسی معکوس حذف شود. با بررسی‌های انجام شده، این روش بهبود کارآیی بیش از 4 برابری را به همراه دارد؛ نسبت به حالت out-of-process فعلی (تصویر فوق).
برای فعالسازی آن یا فایل web.config را به صورت ذیل جهت تعیین hostingModel ویرایش کنید:
 <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" hostingModel="inprocess" />
و یا فایل csproj برنامه را به صورت زیر تنظیم نمائید:
 <PropertyGroup>
    <AspNetCoreModuleHostingModel>inprocess</AspNetCoreModuleHostingModel>
</PropertyGroup>
‫۶ سال و ۷ ماه قبل، پنجشنبه ۱۲ بهمن ۱۳۹۶، ساعت ۱۱:۴۹
 ارتقاء به ASP.NET Core 2.1 - معرفی بسته‌ی Microsoft.AspNetCore.App 
Microsoft.AspNetCore.All شامل یکسری بسته‌ی پشتیبانی نشده‌ی توسط تیم ASP.NET Core مایکروسافت هم هست. در نگارش 2.1 این بسته‌های مستقیما پشتیبانی نشده حذف شده و بجای آن meta-package جدیدی به نام Microsoft.AspNetCore.App معرفی شده‌است. این meta-package شامل بسته‌های زیر نیست:
• Microsoft.Data.Sqlite
• Microsoft.Data.Sqlite.Core
• Microsoft.EntityFrameworkCore.Sqlite
• Microsoft.EntityFrameworkCore.Sqlite.Core
• Microsoft.Extensions.Caching.Redis
• Microsoft.AspNetCore.DataProtection.AzureStorage
• Microsoft.Extensions.Configuration.AzureKeyVault
• Microsoft.AspNetCore.DataProtection.AzureKeyVault
• Microsoft.AspNetCore.Identity.Service.AzureKeyVault
• Microsoft.AspNetCore.AzureKeyVault.HostingStartup
• Microsoft.AspNetCore.ApplicationInsights.HostingStartup
اگر به آن‌ها نیاز داشتید، باید مستقیما ارجاعات آن‌ها را تعریف کنید.
meta-package قبلی صرفا تا پایان طول عمر سری 2x پشتیبانی خواهد شد.
مسیر جدید فایل‌های آن‌ها: C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App 
‫۶ سال و ۷ ماه قبل، دوشنبه ۹ بهمن ۱۳۹۶، ساعت ۲۲:۰۳
برای اینکار تعریف breadcrumb به صورت زیر تغییر می‌کند:
export interface BreadCrumb {
  label: string;
  url?: string;
  glyphIcon?: string;
};
بر این اساس اینبار جایی که data مسیر مقدار دهی می‌شود، ساختار زیر را پیدا می‌کند:
data: { breadcrumb: { label: "Parent1", glyphIcon: "glyphicon glyphicon-link" } as BreadCrumb },
پس از آن برای خواندن این ساختار جدید، نیاز به این تغییرات خواهد بود.

‫۶ سال و ۷ ماه قبل، یکشنبه ۸ بهمن ۱۳۹۶، ساعت ۱۴:۰۷
در راهنمای کدنویسی Angular  توصیه شده از اینترفیس‌ها برای تعریف نوع مدل‌ها استفاده شود:

Consider using a class instead of an interface for services and declarables (components, directives, and pipes)

Consider using an interface for data models

البته این مورد موافق‌ها و مخالف‌هایی هم دارد.
در کل سلیقه‌ای است و بهتر است یکنواختی و یک‌دستی کد مدنظر باشد.
‫۶ سال و ۷ ماه قبل، یکشنبه ۸ بهمن ۱۳۹۶، ساعت ۰۱:۵۶
ASP.NET Core 2.0 پشتیبانی توکاری را از این مساله ارائه کرده: «پشتیبانی توکار ASP.NET Core 2.0 از Range headers». به این ترتیب کاربر می‌تواند از قسمت خاصی شروع به درخواست نمایش کند (همان از سرگیری مجدد)، یا نمایشگر قسمت‌های بعدی را پیشتر درخواست و بافر کند.
‫۶ سال و ۸ ماه قبل، شنبه ۷ بهمن ۱۳۹۶، ساعت ۱۷:۲۶
- روش ()RouteTable.Routes.GetWriteLock در سراسر برنامه قابل دسترسی و تغییر است (طول عمر RouteTable.Routes آن با طول عمر برنامه یکی است).
- اگر امکان تبدیل امضای متد را به Task ندارید از روش ذیل استفاده کنید (Task.Run در اینجا اضافی است):
var pages =_pageService.FindAllAsync().GetAwaiter().GetResult();
‫۶ سال و ۸ ماه قبل، شنبه ۷ بهمن ۱۳۹۶، ساعت ۱۳:۱۵
روش تغییر RouteTable در زمان اجرا:
var routes = RouteTable.Routes;
using (routes.GetWriteLock())
{
    // routes.Clear();
    // routes.IgnoreRoute(...);
    // routes.MapRoute(...);
    // routes.Insert(0, newRoute) --> new routes are being added to the end of the route table

    //get last route (default).  ** by convention, it is the standard route.
    var defaultRoute = routes.Last();
    routes.Remove(defaultRoute);
    
    //add some new route for a cms page
    routes.MapRoute(yadayada);

    //add back default route
    routes.Add(defaultRoute);
}
در اینجا رعایت تقدم و تاخر مهم هستند، وگرنه مسیریابی‌های جدید کار نخواهند کرد؛ چون پس از default route به انتهای لیست اضافه می‌شوند.
یعنی امضای موجودیت‌های تعریف شده‌ی در برنامه‌ی شما مشکل دارند. امضای تک تک آن‌ها را با آخرین نمونه‌های ارسالی تطابق دهید (این امضاها از نگارش 1 به 2، کاملا تغییر کرده‌اند و آخرین تغییرات آن‌ها در مخزن کد، لحاظ شده‌اند).