بازخوردهای دوره
آشنایی با مدل برنامه نویسی TAP
- SynchronizationContext  از دات نت 2 در دسترس است. بنابراین اجازه دهید مصرف کننده از متد Post آن در صورت صلاحدید، در هر جایی که لازم داشت برای ارسال نتیجه‌ی دریافتی به تردی خاص، مثلا ترد UI استفاده کند. در این مورد در مطلب «استفاده از Async و Await در برنامه‌های دسکتاپ» بیشتر بحث شده‌است.
- SynchronizationContext.Current را اگر پیش از آغاز ترد دریافت کنید، به ترد جاری فراخوان اشاره می‌کند. در پایان ترد، می‌توانید از متد Post آن برای بازگشت به ترد قبلی کمک بگیرید.
بازخوردهای دوره
استفاده از Async و Await در برنامه‌های ASP.NET MVC
سلام؛ اگر 
var model = await db.Books.ToListAsync();
همزمان اجرا میشه  ولی بازم برای return باید منتظر پاسخ از db بمونه! پس اینجا فایده ای نداره؟
مشکل من اینجاست که فکر میکنم این روش تنها برای قسمت هایی بدرد میخوره که به هم وابسته نیستن. برای مثال وقتی یه فایل رو آپلود میکنی و بعد آدرس فایل رو ذخیره کنیم فایده نداره. چون تا فایل آپلود نشه ذخیره آدرس تو db  بی معنیه؟
اشتراک‌ها
پروژه refit

REST API Client

ایجاد یک interface با متدهای معادل:

public interface IGitHubApi
{
    [Get("/users/{user}")]
    Task<User> GetUser(string user);
}

نمونه سازی اتوماتیک و فراخوانی سرویس:

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");

var octocat = await gitHubApi.GetUser("octocat");


پروژه refit
اشتراک‌ها
معرفی پیش نمایش TypeScript 2.0

For TypeScript 2.0, the current road map consists of:
    • Non-nullable types
    • Control flow based typed analysis
    • Async/await downlevel support
    • Readonly properties
    • Declared 'this' type in functions
    • Improved typings acquisition

معرفی پیش نمایش TypeScript 2.0
اشتراک‌ها
نگاهی به asynchronous در ES7

ES7 gives us a new kind of function, the async function. Inside of an async function, we have a new keyword, await, which we use to "wait for" a promise 

نگاهی به asynchronous در ES7
اشتراک‌ها
انتشار ویرایش سوم کتاب #Head First C
به شخصه یادگیری زبان #C را از این کتاب شروع کردم . اکنون ویرایش سوم این کتاب با پوشش NET 4.5. منتشر شده است. نکته‌ی جالب این است که دیگر خبری از Windows Forms برای رابط کاربری نیست و کاملا با WPF و XAML جایگزین شده است.
همچنین قابلیت‌های جدید NET 4.5. از جمله asynch و await بررسی شده و گریزی هم به الگوی طراحی MVVM نیز زده است.
انتشار ویرایش سوم کتاب #Head First C
نظرات مطالب
بررسی ساختارهای جدید DateOnly و TimeOnly در دات نت 6
پشتیبانی از انواع داده‌ایی DateOnly, TimeOnly در EF8 اضافه شده است (برای پروایدر SQL Server):
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;


await using var context = new MyDbContext();
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();

context.Users.Add(new User
{
    Name = "John Doe",
    Birthday = new(1980, 1, 20),
    ShiftStart = new (8, 0),
    ShiftLength = TimeSpan.FromHours(8)
});
await context.SaveChangesAsync();

public class MyDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"...")
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging();
    }
    public DbSet<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }
    public required string Name { get; set; }
    public DateOnly Birthday { get; set; }
    public TimeOnly ShiftStart { get; set; }
    public TimeSpan ShiftLength { get; set; }
}
با این DDL:
CREATE TABLE [Users] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [Birthday] date NOT NULL,
    [ShiftStart] time NOT NULL,
    [ShiftLength] time NOT NULL,
    CONSTRAINT [PK_Users] PRIMARY KEY ([Id])
);

نظرات مطالب
اعتبارسنجی مبتنی بر کوکی‌ها در ASP.NET Core 2.0 بدون استفاده از سیستم Identity
ممنون. این راه را نیز قبلا امتحان کرده بودم در کدهای لوکال البته به شکل زیر:
public async Task<int?> GetUserIdAsync()
        {
            var authenticationState = await _authenticationStateProvider.GetAuthenticationStateAsync();
            if (!authenticationState.User.Identity.IsAuthenticated)
                return 0;
            return Convert.ToInt32(authenticationState.User.Claims?.First().Value);
        }
 اما باز هم در صورتی که AuthenticationStateProvider به صورت AddScoped ثبت شود این خطا دریافت می‌گردد:
GetAuthenticationStateAsync was called before SetAuthenticationState

نظرات مطالب
اعتبارسنجی مبتنی بر JWT در ASP.NET Core 2.0 بدون استفاده از سیستم Identity
سلام.
پروژه اعتبارسنجی jwt را مطابق همین پست انجام دادم و روی لوکال روی پورت 4983 اجرا شده است.  پروژه فرانت انگولار روی لوکال پورت 4200 در حال اجراست. و برای لاگین مستقیما به 4983 ریکوئست میفرستد و توکن دریافت میکند. سورس اصلی بکند روی پروژه دیگری روی لوکال پورت 7744 در حال اجراست. فرانت بعد از لاگین دیگر ارتباطی با 4983 ندارد و از این به بعد همه ریکوئست‌ها را به پورت 7744 ارسال میکند. در واقع 4983 فقط پروژه jwt به تنهایی است. فرانت وقتی ریکوئستی را به 7744 میفرستد نیاز به ولید شدن توکن دارد و باید توکن را برای بررسی به 4983 ارسال کند. و در startup 7744 این کد نوشته شده است:
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
            {
                options.Authority = "http://localhost:4983/";
                options.Audience = "Any";
                options.RequireHttpsMetadata = false;
                options.Events = new JwtBearerEvents();
                options.Configuration = new OpenIdConnectConfiguration();
                options.Events.OnTokenValidated = async context =>
                {
                    IEnumerable<Claim> userClaims = await ReadClaimsFromCacheAsync(context);

                    if (ThereIsNoCache(userClaims))
                    {
                        userClaims = await GetUserInfoAsync(context, authority);
                        await StoreInCacheAsync(userClaims, context);
                    }

                    context.Principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "jwt", JwtClaimTypes.Subject, "roles"));
                };
                options.Events.OnAuthenticationFailed = async context =>
                {
                    await TestInvalid(context);
                };
            });
که خطای زیر را دریافت میکنم:
IDX10500: Signature validation failed. No security keys were provided to validate the signature.
ممنون میشم راهنمایی بفرمایید. (نکته: یک کنترلر تستی روی 4983 نوشته ام که بعد از لاگین مستقیم از فرانت کال کردم و بدون مشکل توکن ولید شد و به کنترلر و اکشن موردنظر دسترسی پیدا کرد. ولی وقتی اعتبارسنجی از طریق 7744 صورت میگیرد خطا میدهد.)
نظرات مطالب
Blazor 5x - قسمت ششم - مبانی Blazor - بخش 3 - چرخه‌های حیات کامپوننت‌ها
دلیل دوبار فراخوانی کدهای Razor در هنگام استفاده  از متدهای async سرویس‌های EF چیست ؟آیا راهی برای جلوگیری از تکرار آن وجود دارد؟
در تکه کد زیر کلمه Code دوبار در خروجی چاپ میشود و این برای کار با حلقه ها  باعث کاهش کارایی میشود
@page "/counter"  
@{ Debug.WriteLine("Code"); } @code { protected override async Task OnInitializedAsync() { var _dbContext = new ApplicationDbContext(); await _dbContext.Question.ToListAsync(); } }