‫۱ سال و ۳ ماه قبل، یکشنبه ۳۱ اردیبهشت ۱۴۰۲، ساعت ۱۰:۵۶
یک نکته‌ی تکمیلی
با استفاده از نکته‌ی «کاهش تعداد بار تعریف using‌ها در C# 10.0 و NET 6.0.» و فعالسازی ImplicitUsings، می‌توان using staticها را به صورت سراسری در کل پروژه جایگزین کرد؛ فقط کافی است آن‌ها را به صورت Using Includeهای استاتیک، به فایل csproj. اضافه کرد:

‫۱ سال و ۳ ماه قبل، پنجشنبه ۲۸ اردیبهشت ۱۴۰۲، ساعت ۱۴:۱۳
یک نکته‌ی تکمیلی
اگر از Rider و یا ReSharper استفاده کنید، این نکته‌ی اهمیت ترتیب تعریف فیلدهای استاتیک را به صورت «Static member initializer refers to static member below or in other type part» نمایش می‌دهد:

‫۱ سال و ۳ ماه قبل، یکشنبه ۲۴ اردیبهشت ۱۴۰۲، ساعت ۱۱:۳۰
یک نکته‌ی تکمیلی: استفاده‌های دیگر از github pages
+ روش ساخت راهنمای خودکار برای پروژه‌های کتابخانه‌ای با استفاده از « docfx »
« docfx » امکان اسکن خودکار اسمبلی‌های پروژه‌ی شما و تبدیل XML Comments آن‌ها به یک سایت استاتیک را دارد که می‌توان در نهایت آن‌را در Github pages، همانند نکاتی که در این مطلب مشاهده کردید، منتشر کرد. برای اینکار ابتدا باید ابزار CLI آن‌را نصب کنید:
dotnet tool update -g docfx
پس از نصب آن، اجرای دستور زیر، سبب تولید این سایت استاتیک می‌شود:
docfx docs/docfx.json --serve
یک نمونه از فایل docfx.json تنظیم شده‌ی برای خواندن کامنت‌های یک پروژه را در اینجا می‌توانید مشاهده کنید که به همراه ذکر مسیر فایل csproj و سایر تنظیمات استاندارد docfx است (و اگر خواستید یک نمونه‌ی خالی آن‌را ایجاد کنید، دستور docfx init -q -o docs را صادر کنید). دستور فوق سبب می‌شود تا کار خودکار build پروژه و ساخت سایت استاتیک، در پوشه‌ی docs/_site انجام شود و همچنین server-- آن امکان دسترسی به سایت را در مسیر http://localhost:8080 میسر می‌کند (برای آزمایش و بررسی local).
سپس نیاز است تا این پوشه به صورت github pages در دسترس قرار گیرد. برای اینکار فقط کافی است چند سطر زیر را به تنظیمات github actions خود اضافه کنید تا به ازای هر تغییری در کدها، این توزیع به صورت خودکار انجام شود:
    - run: dotnet tool update -g docfx
    - run: docfx docs/docfx.json

    - name: Deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: docs/_site
با اینکار یک branch جدید به نام gh-pages ایجاد خواهد شد که پوشه‌ی docs/_site را در اختیار github pages قرار می‌دهد. یعنی مطابق نکاتی که در قسمت فعال سازی github pages مطلب جاری مشاهده کردید، باید به قسمت settings->pages در github مراجعه کرده و source را بر روی نام شاخه‌ی جدید gh-pages قرار داده و آن‌را ذخیره کنید. همین مقدار تنظیم جهت آماده شده دسترسی به راهنمای تولید شده به صورت یک سایت استاتیک، کفایت می‌کند.
‫۱ سال و ۳ ماه قبل، شنبه ۱۶ اردیبهشت ۱۴۰۲، ساعت ۱۷:۳۳
یک نکته‌ی تکمیلی: روش بررسی خودکار این موارد

فقط کافی است ابتدا آنالایزرهای توکار SDK جاری را فعال کنید:
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <EnableNETAnalyzers>true</EnableNETAnalyzers>
    </PropertyGroup>
</Project>
سپس یک فایل editorconfig. خالی را در کنار فایل sln. ایجاد کرده و به صورت زیر تکمیل کنید:
[*.cs]

# CA1304: Specify CultureInfo
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1304
dotnet_diagnostic.CA1304.severity = error

# CA1305: Specify IFormatProvider
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1305
dotnet_diagnostic.CA1305.severity = error

# CA1307: Specify StringComparison for clarity
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1307
dotnet_diagnostic.CA1307.severity = error

# CA1308: Normalize strings to uppercase
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1308
dotnet_diagnostic.CA1308.severity = error

# CA1309: Use ordinal string comparison
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1309
dotnet_diagnostic.CA1309.severity = error

# CA1310: Specify StringComparison for correctness
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1310
dotnet_diagnostic.CA1310.severity = error

# CA1311: Specify a culture or use an invariant version
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1311
dotnet_diagnostic.CA1311.severity = error

# CA1820: Test for empty strings using string length
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1820
dotnet_diagnostic.CA1820.severity = error

# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1834
dotnet_diagnostic.CA1834.severity = error

# CA1858: Use 'StartsWith' instead of 'IndexOf'
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1858
dotnet_diagnostic.CA1858.severity = error

# CA2249: Consider using 'string.Contains' instead of 'string.IndexOf'
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2249
dotnet_diagnostic.CA2249.severity = error

# CA2251: Use 'string.Equals'
# Help link: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2251
dotnet_diagnostic.CA2251.severity = error
یک نکته‌ی تکمیلی: روشی برای عدم استفاده از Razor Pages جهت لاگین کاربران در برنامه‌های Blazor Server

در این سری، از razor pages به همراه قالب پیش‌فرض ASP.NET Core Identity، جهت پیاده سازی ورود کاربران به سیستم، استفاده شده‌است. یعنی کاربر یکبار از فضای Blazor Server خارج شده و وارد یک برنامه‌ی ASP.NET Core Razor Pages معمولی می‌شود؛ لاگین می‌کند (در یک ناحیه‌ی مخصوص razor pages) و سپس مجددا وارد قسمت Blazor Server می‌شود که ... تجربه‌ی کاربری مطلوبی را به همراه ندارد. علت این خروج و ورود را هم در این مطلب می‌توانید مطالعه کنید: «دستیابی به HttpContext در Blazor Server». هدف این بوده که بتوان با استفاده از HttpContext مهیای در razor pages (و نه توسط اتصال web socket یک برنامه‌ی blazor server)، کوکی‌های پس از لاگین موفق را به سمت مرورگر ارسال و ثبت کرد و درگیر مشکلات به همراه دسترسی به HttpContext در برنامه‌های Blazor server نشد.
راه دیگری هم برای مواجه شدن با این مشکل وجود دارد: حذف قسمت razor pages؛ حذف نیاز به خروج و ورود از برنامه‌ی blazor server و ... استفاده از ProtectedBrowserStorage که اکنون جزئی از blazor server استاندارد است؛ جهت ثبت اطلاعات user claims و عدم استفاده از کوکی‌ها که نیاز به دسترسی به HttpContext را دارند. اگر علاقمند به مشاهده‌ی یک مثال کامل در این زمینه هستید، می‌توانید به پروژه‌ی « BlazorServerAuthenticationAndAuthorization   » مراجعه کنید. در اینجا یک CustomAuthenticationStateProvider را به کمک ProtectedSessionStorage طراحی و استفاده کرده تا نیاز به کار با کوکی‌ها برطرف شود و دیگر نیازی به استفاده از razor pages نباشد. البته باید دقت داشت که SessionStorage محدود به tab جاری است و اگر نیاز است اطلاعات آن در تمام برگه‌های باز شده در دسترس باشد، بهتر است از ProtectedLocalStorage استفاده کرد. همچنین باید دقت داشت که چون این protected storageها برای رمزنگاری خودکار اطلاعات از ASP.NET Core data protection API استفاده می‌کنند، نکات مطلب « غیرمعتبر شدن کوکی‌های برنامه‌های ASP.NET Core هاست شده‌ی در IIS پس از ری‌استارت آن » نیز در مورد آن‌ها صادق است.
‫۱ سال و ۳ ماه قبل، پنجشنبه ۱۴ اردیبهشت ۱۴۰۲، ساعت ۱۳:۳۷
یک نکته‌ی تکمیلی: چگونه یک برنامه‌ی هاست شده‌ی در IIS را همواره زنده (در حال اجرا) نگه داریم؟

application pool برنامه‌های هاست شده‌ی در IIS، پس از مدتی بیکاری، خاموش می‌شوند. راه اندازی مجدد آن‌ها هم وابسته به رسیدن یک درخواست جدید به آن‌ها است. یعنی اگر برای مثال بخواهید یک کار پس زمینه‌ای را توسط یک برنامه‌ی ASP.NET مدیریت کنید، احتمال از کار افتادن آن به علت خاموش شدن و عدم راه اندازی خودکار application pool، بسیار زیاد است. برای رفع این مشکل و زنده نگه‌داشتن برنامه اگر از یک سیستم توسعه‌ی معمولی استفاده می‌کنید، ابتدا مطمئن شوید که Application Initialization Module که جزئی از Windows Features است، نصب شده‌است:

و اگر از ویندوز سرور استفاده می‌کنید، باید Application Initialization را در قسمت Application Development فعال کنید:

- Open the Add Roles and Features Wizard.
- In the Select role services panel, open the Application Development node.
- Select the checkbox for Application Initialization.

سپس به تنظیمات application pool برنامه مراجعه کرده و دو تغییر زیر را اعمال کنید:
Start Mode -> AlwaysRunning
Idle Time-Out (minutes) -> 0


همچنین حالت Preload برنامه را نیز باید فعال کرد و برنامه هم باید در حالت In-Process hosting model اجرا شود:
Connections panel -> Sites node -> Right-click the app ->
Manage Website > Advanced Settings -> Set Preload Enabled -> True

‫۱ سال و ۳ ماه قبل، پنجشنبه ۱۴ اردیبهشت ۱۴۰۲، ساعت ۱۳:۰۶
یک نکته‌ی تکمیلی: ابزار CLI مایکروسافت برای تولید خودکار کدهای کلاینت #C براساس استاندارد OpenAPI

ابزار جدید Microsoft.dotnet-openapi  کار تولید کدهای یک کلاینت سی‌شارپی را بر اساس OpenAPI Specification انجام می‌دهد. برای استفاده‌ی از آن، ابتدا با استفاده از دستور dotnet tool install -g Microsoft.dotnet-openapi، کار نصب ابزار CLI آن انجام خواهد شد و سپس برای استفاده از آن، به فایل csproj. خود، تنظیمات زیر را اضافه کنید:
<Project Sdk="Microsoft.NET.Sdk.Worker">
  <ItemGroup>
    <OpenApiReference Include="OpenAPIs\v1.json" CodeGenerator="NSwagCSharp" 
         Namespace="GettingStarted" ClassName="MyClient">
      <SourceUri>https://geo.api.vlaanderen.be/capakey/v2/swagger/docs/v1</SourceUri>
    </OpenApiReference>
  </ItemGroup>
</Project>
تنظیم Include آن، یکی کپی محلی از فایل json ذکر شده‌ی در SourceUri را تهیه می‌کند. سایر موارد، تنظیمات فضای نام و کلاس تولید شده‌ی مرتبط است.
حتی بر اساس این ابزار CLI، خود ویژوال استودیو هم گزینه‌ی جدید Add –> Service Reference -> OpenAPI  را اضافه کرده‌است که تنظیمات یاد شده‌ی فوق را توسط یک رابط کاربری جدید دریافت می‌کند: