Il blog di Sandro Rizzetto

Rendermode global in Blazor webapp con autenticazione (e del perché la colpa è sempre tua...)

 

Oggi ho imparato due cose, la prima diciamo tecnica e la seconda di comportamento...

All'interno di una webapp Blazor Server solitamente setto il rendermode sulla singola pagina, perché ho sempre pensato di essere più flessibile se dovessi avere delle pagine che non necessitino di interattività (es. pagine SSR con puro rendering server side ma senza controlli).

Nell'app che sto sviluppando però sono praticamente certo che tutte abbiano bisogno del modo InteractiveServer e quindi sapendo che è possibile settarlo globalmente all'interno del tag <Route> nel file app.razor, lo levo da tutte le pagine e lo metto qui:

<body>
    <Routes @rendermode="@(new InteractiveServerRenderMode(prerender:false))" />
    <script src="_framework/blazor.web.js"></script>
</body>

Compilo, funziona e vado avanti un paio di orette a sviluppare senza problemi.

Arrivato all'ora della pausa caffé, decido di ottimizzare i tempi e mentre io sono a sorseggiare la nera bevanda e chiaccherare per un quart'ora con i colleghi lancio un update di Visual Studio (17.13.x) che contemporaneamente mi aggiorna anche il .net sdk alla 9.0.201

Torno dal caffé, rilancio il progetto e PUM! Un tristissimo "Not found" mi accoglie e dà inizio alle mie due orette di passione

 

Provo a cercare la stringa per capire se è un mio componente, uno della libreria di terze parti che uso oppure qualcosa nelle pagine di gestione account del template microsoft di progetto: NADA!

Faccio una ricerca addirittura binaria in tutte le dll della bin, niente.

Sono sicuro che è colpa di quel maledetto update di VS o .net quindi comincio a cercare come fare il downgrade...

Sui forum, github issues, ecc. nessuno ha questo problema...

Nel frattempo provo a fare una nuova solution e importo poco alla volta i progetti e procedo in modo dicotomico finché si schianta... ma non ne capisco mai la causa!

Per sicurezza apro un altro progetto che usa la stessa autenticazione integrata e lì nessun problema... mmhhh

La faccio breve... dopo che San Pietro è sceso a chiedermi se potevo per cortesia smetterla di invocare i suoi colleghi e il suo Superiore, ho l'intuizione di capire che è colpa di quell'attributo al tag Route che avevo aggiunto la mattina e di cui mi ero dimenticato; creo un progetto nuovo con l'autenticazione e vedo che Microsoft lo sapeva!! e lo setta condizionalmente a null per le pagine che "non accettano l'InteractiveRouting", in pratica per le pagine sotto "/Account"

<body>
    <Routes @rendermode="PageRenderMode" />
    <script src="_framework/blazor.web.js"></script>
</body>

</html>

@code
{
    [CascadingParameter]
    private HttpContext HttpContext { get; set; } = default!;

    private IComponentRenderMode? PageRenderMode =>
        HttpContext.AcceptsInteractiveRouting() ? new InteractiveServerRenderMode(prerender: false) : null;
}

Ma perché per tutta la mattina prima del caffé non avevo avuto problemi? Perché non mi ero mai sloggato! e quindi le pagine della /account non erano mai state "touched"

Lesson learned: mai applicare update "pesanti" di VS o .net o qualunque altra cosa che possa sviarti da un tuo bug durante sessioni di coding. Farlo solo dopo aver committato ed essere sicuri che il progetto sia in uno stato "safe"

Commenti (2) -

  • Antonio

    06/04/2025 19:12:39 | Rispondi

    Premetto che non sono un programmatore, ma mi piace smanettare su queste cose.
    ho cambiato la proprietà da:
    private IComponentRenderMode? PageRenderMode =>
            HttpContext.AcceptsInteractiveRouting() ? InteractiveServer : null;

    a così come postata sull'articolo:
    private IComponentRenderMode? PageRenderMode =>
            HttpContext.AcceptsInteractiveRouting() ? new InteractiveServerRenderMode(prerender: false) : null;


    e sono spariti tutti gli sfarfallii che avevo ad ogni aggiornamento di pagina.

    Il progetto l'ho creato con l'autenticazione Microsoft Identity ma al momento ancora non l'avevo utilizzata.



    • Sandro

      06/04/2025 20:45:34 | Rispondi

      Beh certo... disabilitando il prerendering (cosa che a mio avviso microsoft dovrebbe farlo di default perché pressoché inutile) non hai un "doppio" refresh
      Per rendertene conto metti un breakpoint nella oninitialized e vedrai che con prerendering=true (ovvero il modo che usavi te) ci passa due volte. Mortale se interroghi un database o un servizio "lento"

Aggiungi Commento

Copyright © 1997-2025 Sandro Rizzetto | All Rights Reserved | Riproduzione delle fotografie vietata | Powered by me