‫۷ سال و ۸ ماه قبل، سه‌شنبه ۵ بهمن ۱۳۹۵، ساعت ۲۲:۳۰
یک نکته: بارگذاری مجدد اطلاعات فایل config در ASP.NET Core 1.1
تنظیم reloadOnChange به true ایی که در متن عنوان شد، فقط با IConfigurationRoot و دیکشنری آن کار می‌کند. اگر از تنظیمات strongly typed استفاده کنید، این گزینه بر روی آن تاثیری نخواهد داشت. در نگارش 1.1، اینترفیس جدیدی را به نام IOptionsSnapshot معرفی کرده‌اند که به تغییرات فایل کانفیگ واکنش نشان می‌دهد. بنابراین تنها کاری را که باید انجام دهید، جایگزین کردن <>IOptions با <>IOptionsSnapshot است. سایر تنظیمات صورت گرفته یکی است و تفاوتی نمی‌کند.
‫۷ سال و ۸ ماه قبل، سه‌شنبه ۵ بهمن ۱۳۹۵، ساعت ۱۴:۱۶
خلاصه‌ی نظرات بحث جاری:
- اگر برنامه‌ی download manager ایی نصب است که پسوندهای pdf را به صورت خودکار شناسایی و دریافت می‌کند، کار به نمایش فایل PDF نخواهد رسید. پسوند PDF را از لیست قابل شناسایی آن‌ها حذف کنید.
- اگر Active-X مربوط به Adobe Reader بر روی سیستم کلاینت نصب نباشد، این روش با تمام مرورگرها کار نخواهد کرد؛ چون تمام آن‌ها PDF Reader ندارند (مانند کروم و یا فایرفاکس).
- اگر از کتابخانه‌ی PDF Report استفاده می‌کنید، متد data.FlushInBrowser(fileName, FlushType.Inline) نکات بحث فوق را دارد.
- روش دیگر اینکار (نمایش فایل PDF در مرورگر) استفاده از Response.Redirect است به آدرس فایل PDF بر روی سرور. اگر مرورگر PDF Reader و یا Active-X مربوطه را داشته باشد و همچنین برنامه‌ی download manager ایی هم مزاحمت ایجاد نکند، فایل PDF در مرورگر نمایش داده خواهد شد (البته در یک صفحه‌ی جدید).
- با استفاده از افزونه‌ی pdf.js هم می‌توان فایل‌های PDF را رندر کرد (یک مثال و مثالی دیگر).
‫۷ سال و ۸ ماه قبل، جمعه ۱ بهمن ۱۳۹۵، ساعت ۲۲:۴۴
- «... Id را دستی مقدار دهی نکنید؛ تاثیری ندارد. زیرا اطلاعات شیء جدید حساب، در سیستم tracking مرتبط با Context جاری وجود ندارد. بنابراین EF آن‌را به عنوان یک شیء کاملا جدید درنظر خواهد گرفت، صرفنظر از اینکه Id را به چه مقداری تنظیم کرده‌اید ...»
+ «...  وارد کردن یک شیء به سیستم Tracking »
‫۷ سال و ۸ ماه قبل، پنجشنبه ۳۰ دی ۱۳۹۵، ساعت ۲۱:۴۶
بله. نکات مطلب «تزریق خودکار وابستگی‌ها در ASP.NET Web API به همراه رها سازی خودکار منابع IDisposable» در این مثال لحاظ شده‌اند. به همین جهت کنترلر AccountApiTest آن دارای تزریق وابستگی‌های آزمایش شده‌ی در سازنده‌ی آن است.
‫۷ سال و ۸ ماه قبل، چهارشنبه ۲۹ دی ۱۳۹۵، ساعت ۱۷:۴۴
یک نکته‌ی تکمیلی
شبیه سازی customErrors در نگارش‌های دیگر ASP.NET که در فایل web.config قابل تنظیم است:
<customErrors mode="On" defaultRedirect="error">
        <error statusCode="404" redirect="error/notfound" />
        <error statusCode="403" redirect="error/forbidden" />
</customErrors>
در ASP.NET Core چنین شکلی را پیدا می‌کند. ابتدا در متد Configure کلاس آغازین برنامه، میان افزارهای مطلب فوق را اضافه می‌کنیم:
        public void Configure(IApplicationBuilder app)
        {
            if (env.IsDevelopment())
            {
                app.UseDatabaseErrorPage();
                app.UseDeveloperExceptionPage();
            }
            app.UseExceptionHandler("/error/index/500");
            app.UseStatusCodePagesWithReExecute("/error/index/{0}");
در اینجا ذکر مسیر کامل اکشن متد Index و کنترلر Error ضروری هستند. سپس این کنترلر چنین محتوایی را خواهد داشت:
    public class ErrorController : Controller
    {
        private readonly ILogger<ErrorController> _logger;

        public ErrorController(ILogger<ErrorController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index(int? id)
        {
            var logBuilder = new StringBuilder();

            var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
            logBuilder.AppendLine($"Error {id} for {Request.Method} {statusCodeReExecuteFeature?.OriginalPath ?? Request.Path.Value}{Request.QueryString.Value}\n");

            var exceptionHandlerFeature = this.HttpContext.Features.Get<IExceptionHandlerFeature>();
            if (exceptionHandlerFeature?.Error != null)
            {
                var exception = exceptionHandlerFeature.Error;
                logBuilder.AppendLine($"<h1>Exception: {exception.Message}</h1>{exception.StackTrace}");
            }

            foreach (var header in Request.Headers)
            {
                var headerValues = string.Join(",", value: header.Value);
                logBuilder.AppendLine($"{header.Key}: {headerValues}");
            }
            _logger.LogError(logBuilder.ToString());

            if (id == null)
            {
                return View("Error");
            }

            switch (id.Value)
            {
                case 401:
                case 403:
                    return View("AccessDenied");
                case 404:
                    return View("NotFound");

                default:
                    return View("Error");
            }
        }
    }
- در اینجا اگر UseExceptionHandler فعال شده باشد، امکان دسترسی به سرویس IExceptionHandlerFeature خواهد بود.
- و اگر UseStatusCodePagesWithReExecute فعال شده باشد، سرویس IStatusCodeReExecuteFeature اطلاعات مسیر اصلی درخواستی را ارائه می‌دهد.
- سپس بر اساس id ارسالی به این اکشن متد می‌توان برای مثال صفحه‌ی 404 (یافت نشد) و یا سایر صفحات دلخواه دیگری را به صورت انتخابی نمایش داد.
‫۷ سال و ۸ ماه قبل، پنجشنبه ۲۳ دی ۱۳۹۵، ساعت ۲۲:۴۸
بررسی xhr.status === 401 در قسمت شکست عملیات ای‌جکسی رخ می‌دهد. دراینجا می‌توانید پیام خطایی را نمایش داده و مانند تمام سیستم‌های اعتبارسنجی، درخواست را برگشت بزنید. البته در اینجا کمی محترمانه‌تر است، چون اجبار به لاگین مجدد، تنها در صورت شکست عملیات و درخواست ای‌جکسی doRefreshToken ضروری خواهد بود. اگر doRefreshToken موفقیت آمیز بود، پیامی را در جهت «لطفا مجددا سعی کنید»، نمایش دهید (و در این حالت کاربر نیازی به لاگین مجدد ندارد؛ چون به صورت خودکار توکن او به روز شده‌است). اگر doRefreshToken موفقیت آمیز نبود، قسمت لاگین را بلافاصله نمایش دهید.
‫۷ سال و ۸ ماه قبل، پنجشنبه ۲۳ دی ۱۳۹۵، ساعت ۱۵:۵۱
- هدف از بحث جاری صرفا «اعمال تزریق وابستگی‌ها» هست.
- سری مباحث ASP.NET Identity 2,x را از اینجا شروع به مطالعه کنید. برای نمونه: «افزودن تصدیق ایمیل به ASP.NET Identity در MVC 5» و «Identity 2.0 : تایید حساب‌های کاربری و احراز هویت دو مرحله ای » و «پیاده سازی یک سیستم دسترسی Role Based در Web API و AngularJs - بخش اول»


جهت اطلاع عموم
ASP.NET Identity 2.x یک پروژه‌ی خاتمه یافته از دیدگاه مایکروسافت محسوب شده و دیگر پشتیبانی خاصی ندارد . نگارش بعدی آن ASP.NET Core Identity نام دارد.