‫۶ سال و ۶ ماه قبل، سه‌شنبه ۲۲ اسفند ۱۳۹۶، ساعت ۱۲:۲۵
یک نکته‌ی تکمیلی: روش معرفی فایل‌های Razor به صورت HTML به VSCode

به قسمت File -> Preferences -> Settings مراجعه کرده و تنظیمات ذیل را اضافه کنید:
{
  "editor.formatOnSave": true,
  "emmet.includeLanguages": {
    "razor": "html"
  },
  "files.associations": {
    "*.cshtml": "html"
  }
}
- به این ترتیب قابلیت emmet در فایل‌های razor فعال می‌شود (برای مثال تایپ کنید div.className و سپس دکمه‌ی tab را فشار دهید تا یک div به همراه class ایجاد شود.)
- همچنین قابلیت فرمت و auto complete توکار VSCode برای فایل‌های cshtml فعال شده‌اند.
- editor.formatOnSave هم فرمت کردن خودکار فایل را به ازای هر بار save آن انجام می‌دهد.
البته باید درنظر داشت که از نگارش 1.17 افزونه‌ی #C آن، پشتیبانی رسمی از Razor صورت می‌گیرد.
‫۶ سال و ۶ ماه قبل، دوشنبه ۲۱ اسفند ۱۳۹۶، ساعت ۱۴:۲۲
البته اگر از VSCode استفاده می‌کنید، intellisense آن فعال است (ارائه‌ی Tooling قوی، یکی از مهم‌ترین اهداف و مزایای TypeScript است):


و همچنین افزونه‌ی سرویس زبان Angular، این خطاها را در همان لحظه نمایش می‌دهد:


‫۶ سال و ۶ ماه قبل، پنجشنبه ۱۷ اسفند ۱۳۹۶، ساعت ۱۳:۲۰
یک نکته‌ی تکمیلی
شروع به تکمیل API دات نت جهت پشتیبانی از Spanها: System.IO in .NET Core 2.1 sneak peek
و همچنین نمایی از این تغییرات که بیشتر مبتنی بر افزودن Spanها به قسمت‌های مختلف API موجود است:

 
namespace System.IO
{
    public static class Path
    {
        public static ReadOnlySpan<char> GetExtension(ReadOnlySpan<char> path);
        public static ReadOnlySpan<char> GetFileName(ReadOnlySpan<char> path);
        // ...
- برای اولین باری که برنامه بارگذاری می‌شود، یک anti-forgery token تولید خواهد شد. پس از لاگین، این توکن به اطلاعات شخص متصل می‌شود. در حین logout دیگر این توکن قابلیت استفاده‌ی مجدد را ندارد و خطای فوق را دریافت می‌کنید. به همین جهت اگر logout به صورت POST انجام می‌شود، آن‌را تبدیل به GET کنید؛ از این جهت که HttpClient نگارش 4.3 به بعد اگر یکی از شرایط زیر برقرار باشد (درخواست‌های از نوع GET یا HEAD و یا آدرس‌های مطلق)، این هدر را ارسال نمی‌کند و همچنین AutoValidateAntiforgeryTokenAttribute سمت سرور هم به درخواست‌های از نوع GET واکنش نشان نمی‌دهد:
const lcUrl = request.url.toLowerCase();
if (request.method === "GET" || request.method === "HEAD" ||
          lcUrl.startsWith("http://") || lcUrl.startsWith("https://")) {
          // skip
}

چند نکته‌ی تکمیلی:
- برای یک چنین حالت‌هایی، خصوصا حالت آدرس‌های مطلق (برنامه در یک زیر پوشه اجرا شود)، نیاز است یک interceptor سفارشی ایجاد کرد.
- سفارشی سازی نام کوکی و هدر در HttpClient توسط HttpClientXsrfModule انجام می‌شود:
 imports: [   HttpClientModule,  
   HttpClientXsrfModule.withConfig({
     cookieName: 'My-Xsrf-Cookie',
     headerName: 'My-Xsrf-Header'
   }) ]
- به احتمال زیاد مسیرهای فایل tsconfig.json را بر اساس پوشه‌های پروژه‌ی خودتان وارد نکرده‌اید و با آن تطابقی ندارند. برای مثال تنظیم زیر در فایل tsconfig.json قرار گرفته در پوشه‌ای که فایل angular-cli.json. هست :
{
  "compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "@app/core/*": [ "app/core/*" ],
    }
  }
}
به معنای وجود پوشه‌ی src/app/core در پروژه‌ی شما است که به نام مستعار app/core@ نگاشت شده‌است.
- برای نمونه نکات این مطلب به پروژه ASPNETCore2JwtAuthentication  اعمال شده‌اند و مشکلی در اجرای برنامه نیست.
‫۶ سال و ۶ ماه قبل، سه‌شنبه ۱۵ اسفند ۱۳۹۶، ساعت ۲۳:۲۰
سیستم identity یک سیستم مبتنی بر کوکی‌ها هست و زمانیکه لاگین می‌کنید، Claims کاربر در یک کوکی رمزنگاری شده درج می‌شود تا در درخواست بعدی، پردازش شده و اطلاعات شیء this.User را مقدار دهی کند. بنابراین ترکیب آن در اینجا (یک سیستم مبتنی بر توکن‌ها) فقط از دیدگاه مدیریت کاربران و نقش‌های آن معنا پیدا می‌کند و چون در طراحی این مطلب از لایه سرویس استفاده شده و لایه سطح بالاتر از پیاده سازی‌های جزئیات آن باخبر نیست و وابستگی‌های مورد نیاز را تنها از طریق تزریق وابستگی‌ها دریافت می‌کند، فقط کافی است UsersService.cs را با توجه به سیستم identity بازنویسی کنید.
‫۶ سال و ۶ ماه قبل، سه‌شنبه ۱۵ اسفند ۱۳۹۶، ساعت ۱۲:۴۰
چیزی به نام Automatic Migrations در EF Core وجود خارجی ندارد و حذف شده‌است و اجرای فایل _01-add_migrations.cmd برای تولید اسکریپت‌های SQL تشکیل جداول و روابط بین آن‌ها، اجباری است. کار قطعه کد Database.Migrate صرفا اجرای این اسکریپت‌های SQL اعمال نشده‌ی به بانک اطلاعاتی است و نه تولید آن‌ها.