Blazor w .NET 10: renderowanie, stan i AI

Temat: AI SDLC

Blazor w .NET 10 pozwala budować interfejs webowy w C#, ale wybór technologii nie kończy się na pytaniu „czy zespół zna .NET”. Trzeba osobno rozstrzygnąć miejsce renderowania, granicę interaktywności, sposób przechowywania stanu, odporność połączenia oraz integrację z usługami AI. Najbezpieczniejszy projekt zaczyna się od tabeli decyzji i małego prototypu, a nie od ustawienia jednego trybu dla całej aplikacji.

Blazor w .NET 10: jedna technologia, kilka modeli wykonania

Dokumentacja trybów renderowania Blazor rozróżnia renderowanie statyczne po stronie serwera oraz trzy tryby interaktywne: Interactive Server, Interactive WebAssembly i Interactive Auto. Tryb można ustalić dla komponentu albo obszaru aplikacji. Ta elastyczność jest zaletą, ale łatwo prowadzi do projektu, w którym granice wykonania są nieczytelne.

Static SSR generuje HTML na serwerze bez interaktywnego środowiska Blazor po dostarczeniu strony. Interactive Server obsługuje zdarzenia na serwerze przez obwód połączenia z przeglądarką. Interactive WebAssembly uruchamia kod .NET w przeglądarce po pobraniu aplikacji. Interactive Auto początkowo korzysta z serwera, a po pobraniu pakietu może używać WebAssembly przy kolejnych wizytach. Nie wybieraj trybu według hasła „najszybszy”. Szybkość początkowa, koszt serwera, praca offline, rozmiar pobrania i dostęp do zasobów serwerowych tworzą różne kompromisy.

TrybGdzie działa interakcjaMocna stronaGłówne ograniczenie
Static SSRBrak stałej interakcji BlazorProsty HTML, mały koszt klientaZdarzenia wymagają nawigacji lub innego mechanizmu
Interactive ServerSerwerMały pakiet klienta, bezpośredni dostęp do usług serweraZależność od połączenia i zasobów dla obwodów
Interactive WebAssemblyPrzeglądarkaInterakcja po stronie klienta i mniejsza zależność od obwoduPobranie runtime oraz ograniczony dostęp do zasobów serwera
Interactive AutoSerwer, potem klientStopniowe przejście do WebAssemblyDwa modele wykonania do testowania i utrzymania

Dobieraj tryb na granicy funkcji. Strona informacyjna może pozostać statyczna. Formularz wymagający natychmiastowej walidacji może być interaktywny. Panel pracujący na wrażliwych danych może pozostać po stronie serwera, o ile zespół zaplanuje połączenia, skalowanie i odtwarzanie stanu. Nie zakładaj, że każda interakcja wymaga WebAssembly ani że Interactive Server jest bezstanowym HTTP.

Stan ma właściciela i okres życia

Przegląd zarządzania stanem Blazor opisuje między innymi stan w adresie URL, kontenery stanu w pamięci oraz przekazywanie danych między komponentami. .NET 10 rozszerzył mechanizmy utrwalania podczas prerenderingu. Ogłoszenie .NET 10 wskazuje deklaratywny atrybut PersistentState oraz utrwalanie stanu obwodów jako ważne zmiany Blazor.

Nie oznacza to, że stan aplikacji należy przechowywać w komponencie. Najpierw sklasyfikuj dane. Stan widoku, taki jak wybrana karta, może żyć krótko. Parametr nawigacji powinien znaleźć się w URL, jeśli użytkownik ma móc udostępnić lub odtworzyć widok. Koszyk, sprawa klienta albo wynik procesu wymagają trwałego źródła poza pamięcią komponentu. Dane wrażliwe nie powinny trafiać do przeglądarki tylko dlatego, że komponent korzysta z WebAssembly.

Rodzaj stanuPrzykładZalecane źródło prawdyPytanie kontrolne
NawigacyjnyFiltr, identyfikator widokuURLCzy odświeżenie ma zachować kontekst?
PrezentacyjnyOtwarta sekcjaPamięć komponentu lub klientaCzy utrata stanu powoduje szkodę?
SesyjnyNiedokończony formularzKontrolowany magazyn sesji lub trwały szkicJak długo i dla kogo dane są ważne?
BiznesowyZamówienie, decyzja, uprawnienieBackend i baza danychKto zatwierdza zmianę i prowadzi audyt?
Wynik AISzkic odpowiedzi, cytowaniaBackend wraz z kontekstem ewaluacjiCzy można odtworzyć model, źródła i decyzję?

Prerendering może wykonać logikę przed uruchomieniem interaktywności, dlatego trzeba uważać na podwójne pobieranie danych i różnice między środowiskiem serwera a klienta. Stan utrwalony między fazami powinien mieć jasny zakres. Nie przenoś sekretów, tokenów ani danych dostępnych wyłącznie serwerowi do payloadu klienta.

Hosting i niezawodność wynikają z trybu

Interactive Server wymaga planu dla obwodów. Użytkownik może stracić sieć, proces serwera może zostać zrestartowany, a instancja może zniknąć podczas skalowania. .NET 10 poprawia odporność obwodów, ale nie usuwa odpowiedzialności za architekturę. Określ zachowanie przy rozłączeniu, limit czasu, sposób zachowania pracy oraz konsekwencje ponownego wykonania działania.

Interactive WebAssembly przenosi część kosztu do klienta. Sprawdź rozmiar pierwszego pobrania, wydajność na słabszym urządzeniu, politykę cache i zgodność używanych bibliotek z WebAssembly. Kod klienta jest dostępny użytkownikowi, więc nie umieszczaj w nim sekretów. Każda operacja biznesowa nadal musi przejść autoryzację w API.

Static SSR dobrze pasuje do treści i przepływów opartych na formularzach. Nie jest „gorszym Blazorem”. Mniejsza interaktywność może zmniejszyć liczbę stanów awarii, koszt hostingu i ilość kodu wysyłanego do przeglądarki. Projekt mieszany często jest rozsądniejszy od globalnej deklaracji jednego trybu.

Integracja AI: interfejs nie może ukrywać niepewności

Komponent Blazor powinien wywoływać własną warstwę backendową, a nie bezpośrednio udostępniać klucz do usługi modelowej. Backend egzekwuje tożsamość, limity, politykę danych, filtrowanie narzędzi i zapis obserwowalności. Strumieniowanie odpowiedzi poprawia odczuwalną szybkość, lecz częściowy tekst nie jest ukończonym wynikiem. Interfejs musi pokazać stan generowania, możliwość przerwania, źródła i błąd.

WarstwaOdpowiedzialnośćKontrola przed produkcją
Komponent BlazorZbiera cel i prezentuje wynikDostępność, anulowanie, stany błędu
API aplikacjiAutoryzuje i minimalizuje daneTest dostępu do każdego zasobu
Orkiestracja AIBuduje kontekst i wywołuje model lub narzędziaLista dozwolonych źródeł i operacji
ModelGeneruje propozycjęEwaluacja jakości i scenariusze nadużyć
CzłowiekZatwierdza działanie wysokiego ryzykaWidoczne źródła, zmiany i konsekwencje

Przykład syntetyczny. Aplikacja przygotowuje projekt odpowiedzi na zgłoszenie. Komponent wysyła identyfikator sprawy, nie całą historię przeglądarki. Backend pobiera tylko dane dostępne użytkownikowi, buduje kontekst i zwraca szkic wraz z cytowaniami. Użytkownik może edytować tekst, ale wysłanie wymaga osobnej operacji i ponownej autoryzacji. Szkic AI nigdy nie jest traktowany jako zatwierdzona odpowiedź.

Prototyp rozstrzyga więcej niż dyskusja o trybach

Zbuduj cienki przekrój jednej funkcji w dwóch wariantach. Zmierz czas pierwszego użycia, liczbę połączeń, pamięć serwera, wielkość pobrania oraz zachowanie po utracie sieci. Przetestuj odświeżenie strony w połowie formularza i wdrożenie nowej wersji przy aktywnych użytkownikach. Dla AI dodaj anulowanie odpowiedzi, limit czasu, brak cytowania i odmowę narzędzia.

TestCo symulujeszWarunek akceptacji
Pierwsze wejściePusta pamięć podręczna i wolniejsze łączeUżytkownik widzi użyteczny stan bez błędu
RozłączenieUtrata sieci podczas edycjiBrak cichej utraty zatwierdzonych danych
SkalowanieRestart lub zmiana instancjiOperacja jest odtwarzalna albo bezpiecznie przerwana
AutoryzacjaUżytkownik bez prawa do rekorduBackend odmawia niezależnie od UI
Odpowiedź AIBrak źródła lub timeoutUI pokazuje ograniczenie, nie fałszywy sukces

W .NET 10 ASP.NET Core dodaje wbudowane metryki między innymi dla Blazor, a śledzenie Interactive Server jest bogatsze. Włącz obserwowalność przed testem obciążenia. Sama średnia czasu odpowiedzi nie pokaże zerwanych obwodów, błędów odtwarzania stanu ani kosztu długich strumieni AI.

Granice wyboru Blazor

Blazor jest naturalnym wyborem, gdy zespół chce współdzielić język, modele i kompetencje .NET, a wymagania interfejsu mieszczą się w dostępnych komponentach oraz modelach renderowania. Nie wybieraj go wyłącznie po to, aby uniknąć JavaScript. Integracje przeglądarkowe nadal mogą wymagać JavaScript interop, a ich cykl życia trzeba rozumieć.

Jeśli aplikacja potrzebuje intensywnej pracy offline, bardzo małego początkowego pakietu i złożonej integracji z ekosystemem front end, wykonaj porównawczy prototyp. Jeśli wymaga tysięcy aktywnych obwodów Interactive Server, zmierz rzeczywisty profil pamięci i komunikacji. Jeśli dane biznesowe mają długi cykl życia, zaprojektuj backend niezależnie od komponentów.

Bezpieczeństwo zaczyna się poza komponentem

Ukrycie przycisku nie jest autoryzacją. Użytkownik może wysłać żądanie do API bez użycia interfejsu, dlatego backend sprawdza tożsamość, tenant, uprawnienie do rekordu i dozwoloną operację. Dotyczy to każdego trybu renderowania. Interactive Server wykonuje kod komponentu na serwerze, ale zdarzenie użytkownika nadal nie jest dowodem prawa do zmiany. WebAssembly działa w przeglądarce, więc cały dostarczony kod i konfigurację traktuj jako dostępne klientowi.

Przy integracji AI kontroluj również prompt injection w dokumentach i odpowiedziach z narzędzi. Treść pobrana z pliku nie staje się instrukcją systemową. Orkiestrator powinien oddzielać dane od poleceń, ograniczać listę narzędzi i ponownie autoryzować każdą operację ze skutkiem. Interfejs pokazuje użytkownikowi, kiedy wynik pochodzi z modelu, jakie źródła wykorzystano i które działanie wymaga potwierdzenia.

Walidacja po stronie klienta poprawia doświadczenie, lecz backend powtarza ją dla danych biznesowych. Błąd walidacji, brak dostępu i konflikt wersji to różne stany. Nie pokazuj ich jako jednego komunikatu „coś poszło nie tak”, bo operator nie odróżni błędu użytkownika od incydentu systemowego.

Plan decyzji i migracji

Nie musisz rozstrzygać całej aplikacji w jednym projekcie. Spisz decyzję architektoniczną dla każdej grupy stron: tryb renderowania, właściciel stanu, kontrakt API, wymagania offline i plan obserwowalności. Dodaj powód oraz sygnał ponownego przeglądu, na przykład wzrost liczby aktywnych obwodów albo wymaganie pracy bez sieci.

Pytanie decyzyjnePomiar lub dowódSygnał zmiany architektury
Czy potrzebna jest interaktywność?Zadania użytkownika i prototypStatyczny formularz pokrywa przypadek
Czy stan może zniknąć?Analiza skutku odświeżenia i restartuUtrata wpływa na proces biznesowy
Czy kod może działać u klienta?Klasyfikacja danych i zależnościPotrzebne sekrety lub biblioteka serwerowa
Czy serwer utrzyma obwody?Test pamięci, połączeń i reconnectKoszt lub awaryjność przekracza budżet
Czy AI ma wykonać działanie?Model zagrożeń i macierz uprawnieńBrak jawnej akceptacji człowieka

Przy migracji ze starszej aplikacji Blazor nie zmieniaj jednocześnie hostingu, modelu stanu, uwierzytelniania i warstwy AI. Zacznij od jednej pionowej funkcji. Zachowaj istniejący kontrakt backendu, wprowadź nowy komponent, uruchom testy bezpieczeństwa i obserwowalności, a dopiero potem rozszerz wzorzec. Dzięki temu wiadomo, która zmiana poprawiła lub pogorszyła wynik.

Warstwa webowa jest tylko jednym elementem systemu działania firmy. Gdy aplikacja ma wiele stanowych jednostek biznesowych, długie procesy i niezależne klucze skalowania, kolejnym krokiem jest ocena modelu virtual actor w Microsoft Orleans.

W poniedziałek wybierz jedną funkcję z formularzem, stanem biznesowym i wywołaniem backendu. Rozpisz jej wykonanie dla Static SSR, Interactive Server i Interactive WebAssembly. Odrzuć warianty, które naruszają granicę danych. Dwa pozostałe uruchom jako cienki prototyp i przetestuj rozłączenie. Wynik pomiaru jest lepszą podstawą decyzji niż ogólna obietnica „jednego C# wszędzie”.

Przełóż temat na projekt w Twojej firmie

Zobacz zakres współpracy: od rozpoznania procesu i danych po projekt rozwiązania AI.