Blazor i .NET

Migracija s Web Formsa na Blazor: ekran po ekran, bez prepisivanja svega odjednom

Kako ASP.NET Web Forms aplikaciju prebaciti na Blazor i .NET 10 ekran po ekran iza proxyja, što prelazi lako, što je teško i kako krenuti.

Vlado Pandžić

Vlado Pandžić · Osnivač · Senior .NET arhitekt
Objavljeno · 5 min čitanja

Puno firmi i dalje ima važnu aplikaciju na ASP.NET Web Formsu: portal za narudžbe, interni sustav za skladište ili administraciju, nešto što radi petnaest godina. I dalje radi. Ali svaka promjena traje sve dulje, developeri koji je znaju odlaze, a nitko ne želi biti taj koji će je dirati.

Dobra vijest: prelazak na Blazor ne mora značiti godinu dana prepisivanja dok posao čeka. Aplikacija se može seliti ekran po ekran, dok korisnici i dalje rade i gotovo ništa ne primjećuju.

Zašto se Web Forms ne može samo nadograditi

Web Forms ne postoji u modernom .NET-u. Nikad nije prenesen u ASP.NET Core, pa za njega ne postoji gumb “nadogradi na .NET 10”. Stranice se moraju ponovno izraditi.

.NET Framework 4.8 i dalje je podržan dok je podržana verzija Windowsa na kojoj radi, pa se sutra ništa neće ugasiti. Ali ne dobiva nove mogućnosti, nove biblioteke ga sve češće preskaču, a developera koji žele raditi u Web Formsu svake je godine sve teže naći.

Dva puta: sve odjednom ili ekran po ekran

Sve odjednom izgleda jednostavnije: nova aplikacija gradi se uz staru i jednog dana se prebaci. U praksi to znači mjesece bez novih mogućnosti u staroj aplikaciji, dvije aplikacije koje se održavaju paralelno i puštanje u rad u kojem sve mora proraditi u istom trenutku.

Ekran po ekran to okreće. Ispred stare aplikacije stavi se proxy, a svaki ekran koji prijeđe u Blazor od tada poslužuje nova aplikacija. Korisnici imaju istu adresu i istu prijavu i prelaze sa starih ekrana na nove, a da to i ne primijete.

  1. 1Popis svih ekrana
  2. 2Proxy ispred stare aplikacije
  3. 3Ekran po ekran u Blazor
  4. 4Gašenje stare aplikacije

Proxy: kako stara i nova aplikacija rade zajedno

Proxy je YARP, Microsoftov reverse proxy, koji radi unutar nove Blazor aplikacije. Sve što nova aplikacija zna poslužiti, poslužuje sama. Sve ostalo prosljeđuje staroj Web Forms aplikaciji.

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.MapReverseProxy();

U konfiguraciji jedna ruta hvata sve adrese, s niskim prioritetom, pa vrijedi samo kad ne odgovara nijedna Blazor stranica:

"ReverseProxy": {
  "Routes": {
    "webforms": { "ClusterId": "webforms", "Order": 1000, "Match": { "Path": "{**catch-all}" } }
  },
  "Clusters": {
    "webforms": { "Destinations": { "old": { "Address": "https://orders-legacy.internal/" } } }
  }
}

Kad se ekran s narudžbama izradi u Blazoru, nova aplikacija počinje posluživati /orders, a do starog ekrana više se jednostavno ne dolazi. Prijava i sesija mogu se dijeliti između dviju aplikacija uz Microsoftove System.Web adaptere, pa se korisnici ne moraju prijavljivati dvaput.

Kako izgleda jedan ekran, prije i poslije

Tipična Web Forms tablica sa stranicama:

<asp:GridView ID="OrdersGrid" runat="server" AutoGenerateColumns="false"
    AllowPaging="true" PageSize="20" OnPageIndexChanging="OrdersGrid_PageIndexChanging">
    <Columns>
        <asp:BoundField DataField="Number" HeaderText="Order" />
        <asp:BoundField DataField="Customer" HeaderText="Customer" />
        <asp:BoundField DataField="Total" HeaderText="Total" DataFormatString="{0:C}" />
    </Columns>
</asp:GridView>

Isti ekran u Blazoru, s komponentom QuickGrid koja dolazi uz .NET:

@inject OrderService Orders

<QuickGrid Items="orders" Pagination="pagination">
    <PropertyColumn Property="@(o => o.Number)" Title="Order" />
    <PropertyColumn Property="@(o => o.Customer)" Title="Customer" />
    <PropertyColumn Property="@(o => o.Total)" Title="Total" Format="C" />
</QuickGrid>

<Paginator State="pagination" />

@code {
    private readonly PaginationState pagination = new() { ItemsPerPage = 20 };
    private IQueryable<Order> orders = Enumerable.Empty<Order>().AsQueryable();

    protected override async Task OnInitializedAsync()
        => orders = (await Orders.GetOpenAsync()).AsQueryable();
}

Oznake izgledaju slično. Prava razlika je u onome iza njih: nema ViewStatea, nema postbacka za svaku promjenu stranice, a OrderService je običan C# koji se može testirati i ponovno koristiti.

Što prelazi lako, a što ne

U Web Formsu U Blazoru Posao
Poslovna logika u zasebnim klasama Iste klase, kao servisi Malo
Poslovna logika u code-behindu Prvo se izvlači u servise Srednje
Master stranice Layouti Malo
User controli (.ascx) Komponente Malo do srednje
GridView, Repeater, FormView QuickGrid ili biblioteka komponenti Srednje
Stranice građene oko ViewStatea i postbacka Stanje komponente, uz promišljen tijek Srednje
Web Forms kontrole drugih proizvođača Njihove Blazor verzije ili druge komponente Srednje do puno
Crystal Reports Drugi alat za izvješća Puno
Prijava i sesija zajedničke staroj i novoj aplikaciji System.Web adapteri ili zajednički cookie Srednje, jednom na početku

Najveća nepoznanica nije Blazor, nego koliko je logike zakopano u code-behindu. Gdje je logika već u zasebnim klasama, ekran često prijeđe za nekoliko dana. Gdje svaki klik na gumb skriva stotinu redaka SQL-a i koda sučelja pomiješanih zajedno, tu logiku prvo treba izvući.

Kojim redom seliti ekrane

  1. Prvo jedan jednostavan ekran, da se dokaže da proxy, prijava i isporuka rade od početka do kraja.
  2. Zatim ekrani koji najviše bole: oni koji se često mijenjaju, koji su spori ili na koje se korisnici žale. Tu se selidba prva isplati.
  3. Rijetko korišteni administracijski ekrani na kraju. Popis često otkrije ekrane koje više nitko ne koristi, a njih uopće ne treba seliti.

Kontrolna lista prije početka

  • Popis svih stranica, s oznakom koje se stvarno koriste (logovi ili analitika).
  • NuGet paketi i kontrole drugih proizvođača. Naš besplatni alat za migraciju .NET Frameworka provjerava koji od njih imaju verziju za .NET 10.
  • Kako danas radi prijava: Forms autentikacija, Windows autentikacija ili ASP.NET Identity.
  • Gdje živi poslovna logika: u zasebnim klasama ili u code-behindu.
  • Izvješća, izvozi i e-mailovi koje aplikacija šalje.
  • Tko testira svaki ekran kad prijeđe i tko ga odobrava.

Za širu sliku prelaska s .NET Frameworka pogledajte članak o prelasku s .NET Frameworka na .NET 10, a za pitanje je li Blazor uopće siguran izbor, Je li Blazor još relevantan 2026.?.

Kako mi radimo

Upravo to radimo: Web Forms aplikacije selimo u Blazor ekran po ekran, iza proxyja, dok korisnici i dalje rade u aplikaciji. Krećemo od popisa i plana koji pokazuje koji ekrani idu prvi i gdje su teški dijelovi. Više o pristupu je na stranici Blazor, a prvi korak je besplatan razgovor od 30 minuta.

Izvori

Ovaj članak služi općem informiranju i nije pravni, porezni, financijski ni drugi stručni savjet. Scenariji, primjeri i izračuni su ilustrativni. Uvjeti korištenja i odricanje od odgovornosti.

Povezani članci

© 2026 ProCoding — Sva prava pridržana.Impresum i privatnostUvjeti korištenjaSplit, Hrvatska