Migracja Blazor Web assembly do .NET9

Migracja Blazor Web assembly do .NET9
BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
0

Mam dosyć typową aplikację w Blazor Web assembly dzaiłąjącą w dockerze:

  1. Client - Web assembly, które jest serwowane w kontenerzez z Nginx na porcie 5007
  2. Server - API, które jest serwowane w kontenerze jako apka .NET Core na porcie 5009

Do tej pory w przeglądrce odpalałem adres:5007 i przeglądarka pobierała pliki Web assembly, uruchamiała i zaciągała sobie dane po API z adres:5009. Prosty temat. Zmigrowałem apkę do .NET9 i w Visual Studio wszystko uruchamia się ok, ale jak uruchamiam to w dockerze to na porcie 5007 nie pojawia się nic, za to cała apka dostępna jest na porcie 5009, działa dużo szybciej i w zasadzie bez problemów, ale podczas ładowania wysypują się jakieś błędy (nie może pobrać części dll). W tym momencie zgubiłem się. Rozumiem, że ma to związek z tymi nowymi Render modes. Pytanie tylko jak mam to w tej chwili zmigrować i poprawić (ewentualnie czy ktoś może podesłać link jak aplikację o takiej strukturze powinno sie migrować)?

Z góry dzięki za wskazówki

edytowany 1x, ostatnio: baroo
AD
  • Rejestracja:ponad rok
  • Ostatnio:około 2 godziny
  • Postów:335
0

Oczekujesz od ludzi jasnowidztwa. Bardzo dużo rzeczy zależy od szczegółów implementacyjnych i najpierw musisz sam zgłębić temat i przyjść z kokretnymi pytaniami.

BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
0
Adin napisał(a):

Oczekujesz od ludzi jasnowidztwa. Bardzo dużo rzeczy zależy od szczegółów implementacyjnych i najpierw musisz sam zgłębić temat i przyjść z kokretnymi pytaniami.

Dlaczego na kontenerze, na którym mam jedynie projekt z API widzę stronę (web assembly), która jest w sąsiednim projekcie?

AD
  • Rejestracja:ponad rok
  • Ostatnio:około 2 godziny
  • Postów:335
0

Bo tak masz to skonfigurowane albo zmieniło się coś czego nie rozumiesz. Doczytaj jakie były zmiany w 9 i wtedy będzie ci łatwiej zrozumieć.

BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
0
Adin napisał(a):

Bo tak masz to skonfigurowane albo zmieniło się coś czego nie rozumiesz. Doczytaj jakie były zmiany w 9 i wtedy będzie ci łatwiej zrozumieć.

  1. Czy to oznacza, że od .NET 9 mam zostawić ten projek z Web Assembly w Solucji, ale mogę pominąć w zupełności temat uruchamiania kontenera dockerowego z nginx do jego obsługi? S
  2. Skąd .NET wie jaki projek ma wyświetlić jako stronę startową skoro w projekcie API nie jest to zdefiniowane (a przynajniej ja nie wiem gdzie)?
MB
  • Rejestracja:3 miesiące
  • Ostatnio:około 5 godzin
  • Postów:72
1

Co do blazora jeszcze i trybów renderowania przy okazji to wybierz sobie client lub server, nie wybieraj auto bo psychicznie się wykończysz przy implementowaniu autoryzacji i wysyłaniu zapytań na backend. Blazor auto to jedna wielka pomyłka której nie powinni tworzyć. A no i wyłącz pre render poprzez flagę False, bo to też niejednokrotnie wywala blazora i rujnuje ładowanie strony

edytowany 3x, ostatnio: MrówkaBiegowa
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 7 godzin
  • Postów:5143
1

A moze wrzucisz jakis kod, pliki dockerowe, cokolwiek? :P

BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
0
MrówkaBiegowa napisał(a):

Co do blazora jeszcze i trybów renderowania przy okazji to wybierz sobie client lub server, nie wybieraj auto bo psychicznie się wykończysz przy implementowaniu autoryzacji i wysyłaniu zapytań na backend. Blazor auto to jedna wielka pomyłka której nie powinni tworzyć. A no i wyłącz pre render poprzez flagę False, bo to też niejednokrotnie wywala blazora i rujnuje ładowanie strony

Zaczęło mi się to powoli sklejać, ale mam jeszcze pytanie. Czy jeżeli projekt klienta miał pierwotnie restowe zapytania do serwera to będzie to poprawnie działało jeżeli będę chciał ustawić renderowanie po stronie serwera (jaki adres się wtedy podaje jako adres API przy wstrzykiwaniu HttpClient skoro jest to renderowane na serwerze)?

edytowany 1x, ostatnio: baroo
MB
  • Rejestracja:3 miesiące
  • Ostatnio:około 5 godzin
  • Postów:72
0
baroo napisał(a):
MrówkaBiegowa napisał(a):

Co do blazora jeszcze i trybów renderowania przy okazji to wybierz sobie client lub server, nie wybieraj auto bo psychicznie się wykończysz przy implementowaniu autoryzacji i wysyłaniu zapytań na backend. Blazor auto to jedna wielka pomyłka której nie powinni tworzyć. A no i wyłącz pre render poprzez flagę False, bo to też niejednokrotnie wywala blazora i rujnuje ładowanie strony

Zaczęło mi się to powoli sklejać, ale mam jeszcze pytanie. Czy jeżeli projekt klienta miał pierwotnie restowe zapytania do serwera to będzie to poprawnie działało jeżeli będę chciał ustawić renderowanie po stronie serwera (jaki adres się wtedy podaje jako adres API przy wstrzykiwaniu HttpClient skoro jest to renderowane na serwerze)?

Przede wszystkim, rozumiem, że masz .NET 9?

I po drugie którą dokładnie masz templatkę wybranę i tryb renderowania?

Czy to Blazor Web App - tryb renderowania to WebAssembly? Wrzucam screen dla pewności, u ciebie to wygląda identycznie, czy jakaś inna templatka projektu?

screenshot-20250324190143.png

Czy może masz Blazor WebAssembly Standalone App?
screenshot-20250324190318.png

BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
1

Ogarnąłem. Generowanie po stronie serwera można wymusić ustawiając @rendermode="RenderMode.InteractiveServer":

Kopiuj
<!DOCTYPE html>
<html lang="pl">

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>eTabelki</title>
    <base href="/" />

    <link href="@Assets["https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"]" rel="stylesheet" />
    <link href="@Assets["_content/MudBlazor/MudBlazor.min.css"]" rel="stylesheet" />
    <link href="@Assets["css/app.css"]" rel="stylesheet" />
    <link rel="icon" type="image/png" href="favicon.png" />
    <HeadOutlet @rendermode="RenderMode.InteractiveServer" />
</head>

<body>
    <Routes @rendermode="RenderMode.InteractiveServer" />
    <script src="_framework/blazor.web.js"></script>
    <script src="_content/MudBlazor/MudBlazor.min.js"></script>
    <script src="js/Chart.min.js"></script>
    <script src="_content/ChartJs.Blazor.Fork/ChartJsBlazorInterop.js"></script>
    <script src="js/helper.js"></script>
</body>

Z kolei jeżeli chodzi o zapytania restowe w Web Assembly jeżeli generuje się po stronie serwera to wystraczy ustawić:

Kopiuj
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents()
    .AddInteractiveWebAssemblyComponents();

builder.Services.AddControllersWithViews();

...

app.MapStaticAssets();
app.MapControllers();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode()
    .AddInteractiveWebAssemblyRenderMode();

i potem wstrzyknąć HttpClienta:

Kopiuj
builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(sp.GetRequiredService<NavigationManager>().BaseUri) });

i dotychczasowy content z Web Assembly renderuje się po stronie serwera odpytując localhosta o dane z kontrolerów i zwraca wynik po websoceket do przeglądarki. Dosyć zajebiście to działa.

MB
  • Rejestracja:3 miesiące
  • Ostatnio:około 5 godzin
  • Postów:72
1

Zamiast <HeadOutlet @rendermode="RenderMode.InteractiveServer" /> i <Routes @rendermode="RenderMode.InteractiveServer" />

zastosuj sobie <HeadOutlet @rendermode="new InteractiveServerRenderMode(false)" /> i <Routes @rendermode="new InteractiveServerRenderMode(false)" />

W skrócie, to "false" wyłącza prerender. Prerender jest w blazorze słaby, sprawia wrażenie jakby stronka się zacinała, dostajesz niby szybko widok, a potem przez chwilę nie możesz klikać w nic, beznadziejnie się tego używa. Może na server side lepiej by to działało, na pewno na auto jest zrąbane po całości. Dodatkowo nieraz z autoryzacją i wysyłaniem zapytań http są problemy przez to. Generalnie najbardziej auto render jest zrąbany przez prerender, ale da świętego spokoju radzę ci go i tak wyłączyć przez zastosowanie tego zapisu co podesłałem

BA
Stronka renderuje mi się na tyle szybko, że nie widzę tego zacinania na początku. W sensie nie widzę różnicy po zmianie.
BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 godziny
  • Postów:181
0
MrówkaBiegowa napisał(a):

Zamiast <HeadOutlet @rendermode="RenderMode.InteractiveServer" /> i <Routes @rendermode="RenderMode.InteractiveServer" />

zastosuj sobie <HeadOutlet @rendermode="new InteractiveServerRenderMode(false)" /> i <Routes @rendermode="new InteractiveServerRenderMode(false)" />

W skrócie, to "false" wyłącza prerender. Prerender jest w blazorze słaby, sprawia wrażenie jakby stronka się zacinała, dostajesz niby szybko widok, a potem przez chwilę nie możesz klikać w nic, beznadziejnie się tego używa. Może na server side lepiej by to działało, na pewno na auto jest zrąbane po całości. Dodatkowo nieraz z autoryzacją i wysyłaniem zapytań http są problemy przez to. Generalnie najbardziej auto render jest zrąbany przez prerender, ale da świętego spokoju radzę ci go i tak wyłączyć przez zastosowanie tego zapisu co podesłałem

Wyszła mi jeszcze jedna śmieszna rzecz. Mam przykładowo stringa, w którym trzymam frazę do filtrowania:
private static string searchString = "";
Do tej pory go nie czyściłem za każdym razem w OnInitializedAsync i przy Web Assembly działało bez problemu, a teraz jest tak, że jeżeli na jednym komputerze ktoś coś wpisze do szukajki i ktoś tą stronę otworzy na innym komputerze to widzi to co wpisał ten pierwszy. Czy rozdzielenie tych sesji się jakoś ustawia czy trzeba pamiętać o odpowiednim zainicjalizowaniu każdego pola?

MB
A czemu static? Nie powinno być static. Powinieneś mieć jakąś klasę np. GetCarByNameQuery i w niej pole string Name = string.Empty; Potem używasz obiektu tej klasy w kodzie po prostu robisz GetCarByNameQuery query = new(); i podpinasz w formularzu czy gdzie tam to masz coś na zasadzie query.Name do tego pola. Na pewno nie static.
BA
@MrówkaBiegowa: dzięki. Zdecydowanie za dużo ostatnio gapię w monitor skoro tego nie zauważyłem.
MB
Spoko, blazor spoko framework można się wciągnąć jak ktoś w c# robi

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.