عنوان:

‫استفاده از ProtectedSessionStore در پروژه DntSite


نویسنده: مهرجویی
تاریخ: ۱۴۰۳/۰۹/۰۱ ۰۰:۲۹
آدرس: www.dntips.ir
ضمن درود و سپاس از زحمات شما
من با اجازه شما از پروژه DntSite میخواسم استفاده کنم و برای لاگین از کد OTP استفاده نمایم. در واقع قرار بود بعد بعد از وارد کردن شماره توسط کاربر و بررسی در دیتابیس شماره وارد شده با استفاده از کلاس ProtectedSessionStore در sessionStorage ذخیره کنم و پس از هدایت کاربر به صفحه تایید شماره ذخیره شده را بازیابی کنم. دز زمان ذخیره مقدار در sessionStorage با متد SetAsync دچار خطای زیر می شود.
JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.
پیام اعلام می کند جاوااسکریپت فقط در متد OnAfterRenderAsync قابل پیاده سازی است مشکل اینجاست که این امتد اصلاً فراخوانی نمی شود.
لطفاً در این موضوع راهنمایی نمائید.

نظرات

  • وحید نصیری در ۱۴۰۳/۰۹/۰۱ ۰۰:۵۵
    اگر از Blazor SSR استفاده می‌کنید، فراخوانی متدهای آن‌را باید شبیه به برنامه‌های MVC و یا Razor pages مدیریت کنید؛ یعنی تمام کدهای آن سمت سرور اجرا می‌شوند و در این حالت فراخوانی کدهای جاوااسکریپتی به صورت مستقیم، کاربردی ندارد. ProtectedSessionStore مخصوص Blazor Server طراحی شده و نه Blazor SSR.
    بنابراین کدهای Blazor SSR از این لحاظ با کدهای ASP.NET Core MVC یکی است:
    @page "/"
    
    @{
        httpContext.Session.SetString("name", "Test");
        Name = httpContext.Session.GetString("name");
    }
    
    @Name
    
    @code{
        [CascadingParameter] HttpContext? httpContext{ get; set; }
    
        private string Name = "";
    }
    یا شاید بهتر باشد از SecureCookiesProvider استفاده کنید که در اینجا هم کار می‌کند (زمانیکه به HttpContext دسترسی دارید (اصل قضیه همین مورد است)، مابقی کدهای آن با MVC یکی است).
    • مهرجویی در ۱۴۰۳/۰۹/۰۱ ۰۱:۵۴
      حالا اگر بخواهیم از ProtectedSessionStore برابر این لینک که خود داکیومنت مایکروسافت برای prerendering توضیح داده و در ذیل همین متن کدهای آن قرار داده شده، استفاده کنیم دلیل عدم اجرای فراخوانی تابع OnAfterRenderAsync چیست.
      @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
      @inject ProtectedLocalStorage ProtectedLocalStore
      
      @if (isConnected)
      {
          <p>Current count: <strong>@currentCount</strong></p>
          <button @onclick="IncrementCount">Increment</button>
      }
      else
      {
          <p>Loading...</p>
      }
      
      @code {
          private int currentCount;
          private bool isConnected;
      
          protected override async Task OnAfterRenderAsync(bool firstRender)
          {
              if (firstRender)
              {
                  isConnected = true;
                  await LoadStateAsync();
                  StateHasChanged();
              }
          }
      
          private async Task LoadStateAsync()
          {
              var result = await ProtectedLocalStore.GetAsync<int>("count");
              currentCount = result.Success ? result.Value : 0;
          }
      
          private async Task IncrementCount()
          {
              currentCount++;
              await ProtectedLocalStore.SetAsync("count", currentCount);
          }
      }
      • وحید نصیری در ۱۴۰۳/۰۹/۰۱ ۰۷:۴۹
        روال رویدادگران OnAfterRenderAsync فقط مخصوص حالت‌های Interactive رندر در نگارش‌های جدید Blazor است (چون کار آن به‌روز رسانی DOM مرورگر است که در حالت اجرای کدها در سمت سرور مهیا نیست). ProtectedSessionStore هم به صورت اختصاصی برای rendermode InteractiveServer@ طراحی شده (یا همان Blazor Server سابق)؛ چون از DataProtection سمت سرور برای رمزنگاری اطلاعات استفاده می‌کند (یعنی در حالت WASM قابل استفاده نیست) و از IJSRuntime سمت کلاینت، برای ثبت آن در storage مرورگر و یا خواندن آن (که این مورد، نیاز به دسترسی مستقیم به DOM مرورگر را دارد). فراخوانی تمام متدهای IJSRuntime در حالت رندر سمت سرور (منجمله SSR و prerendering) امکان پذیر نیست (شبیه به حالت عدم امکان فراخوانی مستقیم کدهای جاوااسکریپتی در کدهای یک اکشن متد MVC).
        به صورت خلاصه این ProtectedBrowserStorage ها، مخصوص حالت‌های تعاملی (Interactive) رندر Blazor، در نگارش‌های جدید آن هستند. در حالت‌های غیرتعاملی (مانند SSR و prerendering)، از همان روش‌های متداول MVC مانند استفاده از سشن و کوکی، کمک بگیرید.