‫۳ سال و ۷ ماه قبل، شنبه ۱۱ بهمن ۱۳۹۹، ساعت ۱۶:۰۰
با در نظر گرفتن طرح ابر ایران یا یا بهتر بگم همون اینترنت ملی سابق امکان اختلال در سرویس‌های خارجی وجود داره شما که همه چیز رو منتقل کردید به داخل شاید بهتر باشه از سرویس DNS داخلی استفاده کنید تا از مشکلات DNS احتمالی در آینده هم در امان باشیم. مشابه همین سرویس رو ابرآروان هم به صورت رایگان ارائه میده
در مورد قیمت‌های IR هم جالبه بدونید اگر از سایت‌های هاستینگ داخلی خرید کنید هزینه یکسال 5900 تومان و برای پنج سال 14600 تومان محاسبه می‌کنند. 
یک نکته دیگه،  اگر از متد ApplyConfigurationsFromAssembly که از نسخه 2.2 به بعد در دسترس است برای شناسایی IEntityTypeConfiguration استفاده کنیم، فقط کلاس هایی که سازنده اونها بدون پارامتر هستند شناسایی می‌شوند.    #
سوال چطور می‌تونم داخل کلاس EntityTypeConfiguration به serviceProvider  دسترسی پیدا کنم؟
برای مواردی که مقدارخروجی یک متد ثابت نباشد مثل مقدار هش شده پسورد یا مقدار NewGuid باعث می‌شود در هر مایگریشن جدید کوئری آپدیت ایجاد شود. بعد از ایجاد مایگریشن، مقادیر خروجی رو از فایل مایگریشن جایگزین متد ها کردم و متد‌ها رو کامنت کردم.
‫۷ سال قبل، دوشنبه ۲۷ شهریور ۱۳۹۶، ساعت ۱۴:۴۶
سلام
من از متد OnValidateIdentity برای بررسی آخرین وضعیت کاربر و .. در بازه زمانی X استفاده می‌کنم. مشکلی که من با این متد دارم تغییرات claim‌ها رو به کوکی response اعمال می‌کنه (مثلا تغییر نام کاربر) و تغییرات تا درخواست بعدی کاربر قابل استفاده نیست یعنی CurrentPrincipal تا درخواست بعدی آپدیت نمیشه. در هنگام لاگین این موضوع به چشم نمی‌آید چون با ریدایرکت کردن صفحه request جدیدی که حاوی کوکی آپدیت شده است ایجاد میشه به دنبال اون CurrentPrincipal بروز شده است.
‫۸ سال و ۴ ماه قبل، چهارشنبه ۵ خرداد ۱۳۹۵، ساعت ۱۹:۳۶
پیش فرض این بود که قالب سایت به راحتی تغییر نمی‌کند و با تغییر قالب سایت یک ری استارت عمدی اتفاق بیفتد تا فراخونی آدرس قالب دوباره انجام شود و اطلاعات کش شده توسط bundling  قالب قبلی از حافظه خارج شود.
ولی با در نظر گرفتن موارد مورد نظر شما پیشنهاد من خواندن نام قالب از فایل config.json  در پوشه themes  است. اگر چنین فایلی با محتوای نام قالب وجود داشت که قالب رو فعال کند در غیر اینصورت به حالت پیش فرض asp.net  رفتار کند.
االبته باید bundling رو مدیریت کرد تا از تداخل جلوگیری کرد یا  سایر موارد خارج از بحث قالب از بین نرود. مثلا من خودم area  ادمین رو مستقل طراحی کردم و باید بعد از خالی کردن bundling   و فراخوانی bundle‌های قالب فعال ، bundle‌های ناحیه ادمین فراخوانی شود.
‫۸ سال و ۵ ماه قبل، پنجشنبه ۱۹ فروردین ۱۳۹۵، ساعت ۱۶:۵۵
من از این روش برای منو استفاده کردم ولی وقتی متد Cacheable()  رو به کوئری اضافه می‌کنم فرزندان بصورت درختی تشکیل نمی‌شوند:
var li = _menus
              .Where(m => m.Disable == false && m.LanguageId == culture)
               .OrderBy(m => m.Order)
               //.Cacheable()
               .ToList()
               .Where(m => m.ParentId == null)
               .ToList();
‫۸ سال و ۸ ماه قبل، یکشنبه ۴ بهمن ۱۳۹۴، ساعت ۰۲:۲۹
با توجه به اینکه ساختار page , post , news  و ... خیلی بهم شبیه هستند ,همشون دارای رابطه‌های مشابه دسته بندی ، تگ ، نظر ، امتیاز و ... هستند بهتر نیست همه از یک کلاس مثلا Content  مشتق شوند  و به روش TPT  دیتابیس ایجاد شود؟  حتی می‌تونیم کلاس content  مشتق نشه و فقط فیلد  نوع برای اون مشخص کنیم.
‫۹ سال و ۱ ماه قبل، یکشنبه ۱۸ مرداد ۱۳۹۴، ساعت ۲۰:۳۹
در مثال بالا هر لاگین کاربر حداقل 9 بار کاربر همراه با رل هاش از دیتابیس فراخوانی میشه اگر ورود دو مرحله فعال باشه حدودا 28 بار میشه ، روش پیش فرض که آی دی رو string پیاد سازی کرده رو بررسی کردم چنین مشکلی نداشت. در کلاس ApplicationUserManager متد FindByIdAsync  رو بصورت زیر تغییر بدید می‌تونید تعداد فراخوانی را بررسی کنید: 
      public override Task<ApplicationUser> FindByIdAsync(int userId)
        {
                     return base.FindByIdAsync(userId);
        }

        public override Task<ApplicationUser> FindByNameAsync(string userName)
        {
            return base.FindByNameAsync(userName);
        }
در کدهای  Identity به دفعات از متود  FindByIdAsync  استفاده شده و فرض بر این بوده که دفعات بعد از کش DbContext اسفاده می‌شود.
در سورس UserStore متود FindByIdAsync  از یک متد واسطه  به نام GetUserAggregateAsync استفاده کرده :
public virtual Task<TUser> FindByIdAsync(TKey userId)
        {
            ThrowIfDisposed();
            return GetUserAggregateAsync(u => u.Id.Equals(userId));
        }
     protected virtual async Task<TUser> GetUserAggregateAsync(Expression<Func<TUser, bool>> filter)
        {
            TKey id;
            TUser user;
            if (FindByIdFilterParser.TryMatchAndGetId(filter, out id))
            {
                user = await _userStore.GetByIdAsync(id).WithCurrentCulture();
            }
            else
            {
                user = await Users.FirstOrDefaultAsync(filter).WithCurrentCulture();
            }
            if (user != null)
            {
                await EnsureClaimsLoaded(user).WithCurrentCulture();
                await EnsureLoginsLoaded(user).WithCurrentCulture();
                await EnsureRolesLoaded(user).WithCurrentCulture();
            }
            return user;
        }
وقتی پیاده سازی آی دی براساس int باشه متد FindByIdFilterParser.TryMatchAndGetId درست عمل نمی‌کنه و به جای فراخوانی GetByIdAsync که پشت صحنه از FindAsync و قابلیت فراخوانی از کش رو داره از FirstOrDefaultAsync استفاده می‌کنه و باعث فراخوانی مجدد از دیتابیس می‌شود.
راه حلی که من استفاده کردم پیاده سازی UserStore و تحریف متد FindByIdAsync  :
    public class MyUserStore
        :UserStore<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {

        private DbSet<ApplicationUser> _myUserStore;
        public MyUserStore(ApplicationDbContext context)
            : base(context)
        {
            _myUserStore = (DbSet<ApplicationUser>) context.Set<ApplicationUser>();

        }

        public override Task<ApplicationUser> FindByIdAsync(int userId)
        {
           return  _myUserStore.FindAsync(userId);
        }
  
    }
}
 همچنین در کلاس SmObjectFactory کد زیر :
               ioc.For<IUserStore<ApplicationUser, int>>()
                .HybridHttpOrThreadLocalScoped()
                .Use<UserStore<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>>();
با این کد جایگزین شود :
ioc.For<IUserStore<ApplicationUser, int>>()
                    .HybridHttpOrThreadLocalScoped()
                 .Use<MyUserStore>();