‫۵ سال قبل، یکشنبه ۱۷ شهریور ۱۳۹۸، ساعت ۰۰:۱۴
بله. در همان قسمت switch (entry.State) کدهای فوق، property.CurrentValue به مقدار جدید اشاره می‌کند و property.OriginalValue به مقدار قبلی. می‌توانید دو دیکشنری برای جمع آوری اطلاعات این دو تهیه کنید (در کدهای فوق فقط یک لیست auditEntry.AuditProperties هست که مقادیر جدید را جمع آوری می‌کند) و سپس در یک جدول ثالث، مقدار JSON متناظر با این Dictionaryها را در مرحله‌ی auditEntry.AuditProperties.ToDictionary کدهای فوق، در دو فیلد NewValue و OldValue آن ذخیره کنید.
‫۵ سال قبل، جمعه ۱۵ شهریور ۱۳۹۸، ساعت ۱۴:۵۶
یک نکته‌ی تکمیلی: استفاده از System.Text.Json در ASP.NET Core 3.0 و از کار افتادن تعدادی از اکشن متدها

فرض کنید مدلی را به این صورت تعریف کرده‌اید:
public class ModelIdViewModel
{
   public string Id { set; get; }
}
و اکشن متدی که آن‌را دریافت می‌کند، به این نحو تعریف شده‌است:
public async Task<IActionResult> RenderRole([FromBody]ModelIdViewModel model)

در سمت کلاینت نیز اطلاعات Ajax ای متناظر با آن‌را به صورت زیر ارسال می‌کنید:
data: JSON.stringify({ "id": 1 }),
contentType: "application/json; charset=utf-8",
dataType: "json",
این اکشن متد تا نگارش 2.2، بدون مشکل کار می‌کرد. اما اکنون در نگارش 3، مقدار model آن نال شده‌است.
برای دیباگ آن اگر قطعه کد زیر را اضافه کنیم:
public async Task<IActionResult> RenderRole([FromBody]ModelIdViewModel model)
{
   if (!ModelState.IsValid)
   {
      return BadRequest(ModelState);
   }
یک چنین خروجی در قسمت network ابزارهای توسعه دهندگان مرورگر، ظاهر می‌شود:
 {"$.id":["The JSON value could not be converted to System.String. Path: $.id | LineNumber: 0 | BytePositionInLine: 7."]}
عنوان می‌کند که مقدار id دریافتی را نمی‌تواند به string تبدیل کند.

برای رفع این مشکل، فقط کافی است نوع Id را در model به int تبدیل کرد:
public class ModelIdViewModel
{
   public int Id { set; get; }
}
به عبارتی System.Text.Json جدید، همانند Newtonsoft.Json قبلی، سعی نمی‌کند int دریافتی از کاربر را به string درخواستی در model تبدیل کند. نوع‌ها حتما باید تناظر داشته باشند.
- برای تزریق وابستگی‌ها طراحی نشده. زمانیکه از Activator.CreateInstance برای وهله سازی خودکار استفاده می‌کند، خارج از سیستم تزریق وابستگی‌ها عمل می‌کند.
- یک روش آن همان کاری است که در این مثال انجام شده (به صورت دستی):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   var passwordHasher =  this.GetService<IPasswordHasher<User>>();
با توجه به این نکته و همچنین مطلب «امکان رمزنگاری اطلاعات شخصی کاربران در ASP.NET» استفاده از روش HasData (مطلب جاری) برای کار با Identity اشتباه است و در برابر تغییرات آینده‌ی این کتابخانه مقاوم نیست. از همان روش امن SeedDatabaseWithAdminUserAsync باید استفاده شود.
برای JWT این تغییر را نیاز دارد (توکن دریافتی را پس از لاگین/تولید باید دستی وارد کنید):

services.AddSwaggerGen(c =>
{
    // ... 
    var security = new Dictionary<string, IEnumerable<string>>
    {
        {"Bearer", new string[] { }},
    }; 
    c.AddSecurityDefinition("Bearer", new ApiKeyScheme
    {
        Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
        Name = "Authorization",
        In = "header",
        Type = "apiKey"
    });
    c.AddSecurityRequirement(security);
});
‫۵ سال قبل، چهارشنبه ۱۳ شهریور ۱۳۹۸، ساعت ۰۱:۰۰
البته به این صورت نوشته شده:
protected override string Schedule => "*/10 * * * * *"; //Runs every 10 seconds
و تناظر دارد با نمونه‌ی 6 قسمتی. 10/* هم هر 10 ثانیه خوانده می‌شود (البته بسته به محل قرارگیری که اینجا ثانیه است):
every x hours/min/sec = */x