Dela via


Vara värd för och distribuera ASP.NET Core Blazor

Not

Det här är inte den senaste versionen av den här artikeln. För den aktuella versionen, se version av .NET 9 av den här artikeln.

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.

Viktig

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

Den aktuella versionen finns i .NET 9-versionen av denna artikel.

Den här artikeln beskriver hur du hostar och driftsätter Blazor-appar.

Publicera appen

Appar publiceras för distribution i Release-konfiguration.

Not

Publicera en värdbaserad Blazor WebAssemblylösning från Server projektet.

  1. Välj kommandot Publicera {APPLICATION} från menyn Build, där {APPLICATION} platshållar appens namn.
  2. Välj publiceringsmål. Om du vill publicera lokalt väljer du Mapp.
  3. Acceptera standardplatsen i fältet Välj en mapp eller ange en annan plats. Välj knappen Publish.

När appen publiceras utlöses en återställning av projektets beroenden och bygger projektet innan du skapar resurserna för distribution. Som en del av byggprocessen tas oanvända metoder och sammansättningar bort för att minska appens nedladdningsstorlek och inläsningstider.

Publicera platser:

  • Blazor Web App: Appen publiceras i mappen /bin/Release/{TARGET FRAMEWORK}/publish, där platshållaren {TARGET FRAMEWORK} är målramverket. Distribuera innehållet i mappen publish till värden.
  • Fristående Blazor WebAssembly: Appen publiceras i mappen bin\Release\{TARGET FRAMEWORK}\browser-wasm\publish\. För att distribuera appen som en statisk webbplats kopierar du innehållet i mappen wwwroot till den statiska webbplatsens värd.
  • Blazor Server: Appen publiceras i mappen /bin/Release/{TARGET FRAMEWORK}/publish, där platshållaren {TARGET FRAMEWORK} är målramverket.. Distribuera innehållet i mappen publish till värddatorn.
  • Blazor WebAssembly
    • Fristående: Appen publiceras i mappen /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot eller bin\Release\{TARGET FRAMEWORK}\browser-wasm\publish, beroende på vilken version av SDK som används för att publicera appen. Om du vill distribuera appen som en statisk webbplats, kopiera innehållet i mappen wwwroot till den statiska webbhotellservern.
    • Värdbaserad: Klientens Blazor WebAssembly app publiceras i /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot-mappen för serverappen, tillsammans med andra statiska webbtillgångar i klientappen. Placera innehållet i mappen publish på värdmaskinen.

IIS

För att vara värd för en Blazor app i IIS, kan du se följande resurser:

Delning av en apppool mellan ASP.NET Core-appar stöds inte, inklusive för Blazor appar. Använd en apppool per app när du är värd för IIS och undvik att använda IIS virtuella kataloger för att vara värd för flera appar.

En eller flera Blazor WebAssembly appar som hanteras av en ASP.NET Core-app, som kallas en värdbaserad Blazor WebAssembly lösning, stöds för en apppool. Vi rekommenderar eller stöder dock inte tilldelning av en enda apppool till flera värdbaserade Blazor WebAssembly lösningar eller i värdscenarier för underappar.

Mer information om lösningarfinns i Tooling for ASP.NET Core Blazor.

Applikationens basväg

Den basvägen för appen är appens rot-URL-väg. För att routning i Blazor appar ska lyckas krävs ramverkskonfiguration för alla rot-URL-sökvägar som inte är vid standardappens bassökväg /.

Överväg följande ASP.NET Core-app och Blazor underapp:

  • ASP.NET Core-appen heter MyApp:
    • Appen finns fysiskt på d:/MyApp.
    • Begäranden tas emot på https://www.contoso.com/{MYAPP RESOURCE}.
  • En Blazor app med namnet CoolApp är en underapp för MyApp:
    • Underappen finns fysiskt på d:/MyApp/CoolApp.
    • Begäranden tas emot på https://www.contoso.com/CoolApp/{COOLAPP RESOURCE}.

Utan att ange ytterligare konfiguration för CoolApphar underappen i det här scenariot ingen kunskap om var den finns på servern. Appen kan till exempel inte konstruera rätt relativa URL:er till sina resurser utan att veta att den finns på den relativa URL-sökvägen /CoolApp/. Det här scenariot gäller även i olika värd- och omvända proxyscenarier när en app inte finns på en rot-URL-sökväg.

Bakgrund

En ankartaggs mål (href) kan bestå av en av två slutpunkter:

  • Absoluta platser som innehåller ett schema (standardvärdet för sidans schema om det utelämnas), värd, port och sökväg eller bara ett snedstreck (/) följt av sökvägen.

    Exempel: https://example.com/a/b/c eller /a/b/c

  • Relativa platser som bara innehåller en sökväg och inte börjar med ett snedstreck (/). Dessa löses i förhållande till den aktuella dokument-URL:en eller <base>-taggens värde, om det anges.

    Exempel: a/b/c

Förekomsten av ett avslutande snedstreck (/) i en konfigurerad appbassökväg är viktig för att beräkna bassökvägen för appens URL:er. https://example.com/a har till exempel en bassökväg för https://example.com/, medan https://example.com/a/ med ett avslutande snedstreck har en bassökväg för https://example.com/a.

För källor till länkar som avser Blazor i ASP.NET Core-appar:

  • URL:er i Razor komponenter (.razor) är vanligtvis relativa.
  • URL:er i skript, till exempel Blazor skript (blazor.*.js), är relativa till dokumentet.
  • URL:er som skrivs manuellt i filen _Host.cshtml (Blazor Server) ska alltid vara absoluta om de används i olika dokument.
  • URL:er i Razor komponenter (.razor) är vanligtvis relativa.
  • URL:er i skript, till exempel Blazor skript (blazor.*.js), är relativa till dokumentet.

Om du återger en Blazor app från olika dokument (till exempel /Admin/B/C/ och /Admin/D/E/) måste du ta hänsyn till appens bassökväg, eller så är bassökvägen annorlunda när appen renderas i varje dokument och resurserna hämtas från fel URL:er.

Det finns två sätt att hantera utmaningen att lösa relativa länkar korrekt:

  • Mappa resurserna dynamiskt med det dokument som de renderades på som rot.
  • Ange en konsekvent bassökväg för dokumentet och mappa resurserna under den bassökvägen.

Det första alternativet är mer komplicerat och är inte den mest typiska metoden, eftersom det gör navigeringen olika för varje dokument. Överväg följande exempel för att återge en sida /Something/Else:

  • Renderad under /Admin/B/C/, renderas sidan med en sökväg av /Admin/B/C/Something/Else.
  • Renderas under /Admin/D/E/renderas sidan på samma sökväg för /Admin/B/C/Something/Else.

Under den första metoden erbjuder routning IDynamicEndpointMetadata och MatcherPolicy, vilket i kombination kan vara grunden för att implementera en helt dynamisk lösning som vid körning avgör hur begäranden dirigeras.

För det andra alternativet, som är den vanliga metoden, anger appen bassökvägen i dokumentet och mappar serverslutpunkterna till sökvägar under basen. Följande vägledning använder den här metoden.

Blazor på serversidan

Mappa SignalR-hubben för en Blazor-app på serversidan genom att ange sökvägen till MapBlazorHub i filen Program.

app.MapBlazorHub("base/path");

Fördelen med att använda MapBlazorHub är att du kan mappa mönster, till exempel "{tenant}" och inte bara konkreta vägar.

Du kan också mappa SignalR hubben när appen finns i en virtuell mapp med en förgrening av middleware-pipeline. I följande exempel hanteras begäranden till /base/path/ av hubben SignalR från Blazor.

app.Map("/base/path/", subapp => {
    subapp.UsePathBase("/base/path/");
    subapp.UseRouting();
    subapp.UseEndpoints(endpoints => endpoints.MapBlazorHub());
});

Konfigurera taggen <base> enligt vägledningen i avsnittet Konfigurera appens bassökväg.

Värdbaserat Blazor WebAssembly

Om appen är en värdbaserad Blazor WebAssembly app:

  • I projektet Server (Program.cs):
    • Justera sökvägen för UseBlazorFrameworkFiles (till exempel app.UseBlazorFrameworkFiles("/base/path");).
    • Konfigurera anrop till UseStaticFiles (till exempel app.UseStaticFiles("/base/path");).
  • I Client projektet:
    • Konfigurera <StaticWebAssetBasePath> i projektfilen så att den matchar sökvägen för att servera statiskt webbinnehåll (till exempel <StaticWebAssetBasePath>base/path</StaticWebAssetBasePath> ).
    • Konfigurera taggen <base> enligt vägledningen i avsnittet Konfigurera appens bassökväg.

Ett exempel på hur man är värd för flera Blazor WebAssembly-appar i en värdbaserad Blazor WebAssembly-lösning finns i Flera värdbaserade ASP.NET Core Blazor WebAssembly-appar, där metoder förklaras för domän-/portvärdskap och undersökvägsvärdskap för flera Blazor WebAssembly-client-appar.

Fristående Blazor WebAssembly

I en fristående Blazor WebAssembly app konfigureras endast taggen <base> enligt riktlinjerna i avsnittet Konfigurera appens bassökväg.

Konfigurera appens bassökväg

Om du vill ställa in konfigurationen för Blazor-appens bassökväg för https://www.contoso.com/CoolApp/ska du ange :s appbaskväg (<base>), som också kallas den relativa rotsökvägen.

Genom att konfigurera appbassökvägen kan en komponent som inte finns i rotkatalogen konstruera URL:er i förhållande till appens rotsökväg. Komponenter på olika nivåer i katalogstrukturen kan skapa länkar till andra resurser på platser i hela appen. Appens bassökväg används också för att intercepta valda hyperlänkar där målet för länken href finns inom URI-utrymmet för appens bassökväg. Komponenten Router hanterar den interna navigeringen.

Placera taggen <base> i <head> -markering (plats för <head> innehåll) före alla element med attributvärden som är URL:er, till exempel href attribut för <link> element.

I många värdscenarier är den relativa URL-sökvägen till appen appens rot. I dessa förinställda fall konfigureras appens relativa URL-bassökväg / som <base href="/" /> i <head> innehåll.

I många värdscenarier är den relativa URL-sökvägen till appen appens rot. I dessa standardfall är appens relativa URL-basväg följande i <head> innehåll:

  • Blazor Server: ~/ konfigurerat som <base href="~/" />.
  • Blazor WebAssembly: / konfigurerat som <base href="/" />.

Not

I vissa värdscenarier, till exempel GitHub Pages och IIS-underappar, måste appbassökvägen anges till serverns relativa URL-sökväg för appen.

  • I en Blazor app på serversidan använder du antingen av följande metoder:

    • Alternativ 1: Använd taggen <base> för att ange appens bassökväg (plats för <head> innehåll):

      <base href="/CoolApp/">
      

      Det avslutande snedstrecket krävs.

    • Alternativ 2: Anropa UsePathBaseförsta i appens pipeline för bearbetning av begäranden (Program.cs) omedelbart efter att WebApplicationBuilder har skapats (builder.Build()) för att konfigurera bassökvägen för alla följande mellanprogram som interagerar med begärandesökvägen:

      app.UsePathBase("/CoolApp");
      

      Anrop av UsePathBase rekommenderas när du även vill köra appen Blazor Server lokalt. Ange till exempel start-URL:en i Properties/launchSettings.json:

      "launchUrl": "https://localhost:{PORT}/CoolApp",
      

      Den {PORT}-platshållaren i det föregående exemplet är porten som matchar den säkra porten i den applicationUrl-konfigurationssökvägen. I följande exempel visas den fullständiga startprofilen för en app på port 7279:

      "BlazorSample": {
        "commandName": "Project",
        "dotnetRunMessages": true,
        "launchBrowser": true,
        "applicationUrl": "https://localhost:7279;http://localhost:5279",
        "launchUrl": "https://localhost:7279/CoolApp",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
      }
      

      Mer information om filen launchSettings.json finns i Använda flera miljöer i ASP.NET Core. Mer information om Blazor appbassökvägar och -värd finns i <base href="/" /> eller bastaggalternativ för Blazor MVC-integrering (dotnet/aspnetcore #43191).

  • Fristående Blazor WebAssembly (wwwroot/index.html):

    <base href="/CoolApp/">
    

    Det avslutande snedstrecket krävs.

  • Hostad Blazor WebAssembly (Client projekt, wwwroot/index.html):

    <base href="/CoolApp/">
    

    Det avslutande snedstrecket krävs.

    I Server-projektet anropar du UsePathBaseförsta i appens pipeline för bearbetning av begäranden (Program.cs) omedelbart efter att WebApplicationBuilder har skapats (builder.Build()) för att konfigurera bassökvägen för följande mellanprogram som interagerar med begärandesökvägen:

    app.UsePathBase("/CoolApp");
    

Not

När du använder WebApplication (se Migrera från ASP.NET Core 5.0 till 6.0) måste app.UseRouting anropas efter UsePathBase så att routningsmellanprogrammet kan observera den ändrade sökvägen innan du matchar vägar. Annars matchas rutter innan sökvägen skrivs om av UsePathBase enligt beskrivningen i artiklarna Middleware Ordering och Ruttning.

Prefixa inte länkar i hela appen med ett snedstreck. Undvik antingen att använda en sökvägssegmentavgränsare eller använd punkt-snedstreck (./) för relativ sökvägs notation.

  • felaktig: <a href="/account">
  • korrekt: <a href="account">
  • Korrekt: <a href="./account">

I Blazor WebAssembly webb-API-förfrågningar med HttpClient-tjänstenska du kontrollera att JSON-hjälpare (HttpClientJsonExtensions) inte lägger ett prefix på URL:er med ett snedstreck (/):

  • felaktig: var rsp = await client.GetFromJsonAsync("/api/Account");
  • Rätt: var rsp = await client.GetFromJsonAsync("api/Account");

Prefixa inte Navigeringshanteraren relativa länkar med ett snedstreck. Undvik antingen att använda en sökvägssegmentavgränsare eller använd punkt-snedstreck (./) relativ sökvägs notation (Navigation är en inmatad NavigationManager):

  • felaktig: Navigation.NavigateTo("/other");
  • ✔️ Korrigera: Navigation.NavigateTo("other");
  • Rätt: Navigation.NavigateTo("./other");

I vanliga konfigurationer för Azure/IIS-värdtjänster krävs vanligtvis ingen ytterligare konfiguration. I vissa värd- och omvända proxyvärdsscenarier som inte använder IIS kan ytterligare konfiguration av statisk mellanprogramvara behövas.

  • Så här hanterar du statiska filer korrekt (till exempel app.UseStaticFiles("/CoolApp");).
  • För att betjäna skriptet Blazor (_framework/blazor.*.js). Mer information finns i ASP.NET Core Blazor statiska filer.

För en Blazor WebAssembly app med en icke-rotrelativ URL-sökväg (till exempel <base href="/CoolApp/">) kan appen inte hitta sina resurser när den körs lokalt. För att lösa det här problemet under lokal utveckling och testning kan du ange ett argument för sökvägsbasen som matchar värdet href för taggen <base> vid körning. Ta inte med ett avslutande snedstreck. Om du vill skicka sökvägsbasargumentet när du kör appen lokalt kör du kommandot dotnet watch (eller dotnet run) från appens katalog med alternativet --pathbase:

dotnet watch --pathbase=/{RELATIVE URL PATH (no trailing slash)}

För en Blazor WebAssembly-app med en relativ URL-sökväg på /CoolApp/ (<base href="/CoolApp/">) är kommandot:

dotnet watch --pathbase=/CoolApp

Om du föredrar att konfigurera appens startprofil för att ange pathbase automatiskt i stället för manuellt med dotnet watch (eller dotnet run), anger du egenskapen commandLineArgs i Properties/launchSettings.json. Följande konfigurerar även start-URL:en (launchUrl):

"commandLineArgs": "--pathbase=/{RELATIVE URL PATH (no trailing slash)}",
"launchUrl": "{RELATIVE URL PATH (no trailing slash)}",

Använd CoolApp som exempel:

"commandLineArgs": "--pathbase=/CoolApp",
"launchUrl": "CoolApp",

Antingen genom att använda dotnet watch (eller dotnet run) med alternativet --pathbase, eller genom en startprofilkonfiguration som anger bassökvägen, svarar appen Blazor WebAssembly lokalt på http://localhost:port/CoolApp.

Mer information om filen launchSettings.json finns i Använda flera miljöer i ASP.NET Core. Ytterligare information om Blazor appbas-sökvägar och värdtjänst finns i <base href="/" /> eller base-taggalternativ för Blazor MVC-integrering (dotnet/aspnetcore #43191).

Hämta appens bassökväg från konfigurationen

Följande vägledning beskriver hur du hämtar sökvägen för taggen <base> från en appinställningsfil för olika miljöer.

Lägg till appens inställningsfil i appen. Följande exempel är för den Staging miljön (appsettings.Staging.json):

{
  "AppBasePath": "staging/"
}

I en Blazor app på serversidan läser du in bassökvägen från konfigurationen i <head> innehåll:

@inject IConfiguration Config

...

<head>
    ...
    <base href="/@(Config.GetValue<string>("AppBasePath"))" />
    ...
</head>

Alternativt kan en app på serversidan hämta värdet från konfigurationen för UsePathBase. Placera följande kod första i appens pipeline för bearbetning av begäranden (Program.cs) omedelbart efter att WebApplicationBuilder har skapats (builder.Build()). I följande exempel används konfigurationsnyckeln AppBasePath:

app.UsePathBase($"/{app.Configuration.GetValue<string>("AppBasePath")}");

I en Blazor WebAssembly app på klientsidan:

  • Ta bort taggen <base> från wwwroot/index.html:

    - <base href="..." />
    
  • Ange appens bassökväg via en HeadContent komponent i komponenten App (App.razor):

    @inject IConfiguration Config
    
    ...
    
    <HeadContent>
        <base href="/@(Config.GetValue<string>("AppBasePath"))" />
    </HeadContent>
    

Om det inte finns något konfigurationsvärde att läsa in, till exempel i icke-stagingmiljöer, löses föregående href till rotsökvägen /.

Exemplen i det här avsnittet fokuserar på att tillhandahålla appens bassökväg från appinställningar, men metoden för att läsa sökvägen från IConfiguration är giltig för alla konfigurationsleverantörer. Mer information finns i följande resurser:

Blazor Server MapFallbackToPage konfiguration

Det här avsnittet gäller endast för Blazor Server appar. MapFallbackToPage stöds inte i Blazor Web Appoch Blazor WebAssembly appar.

I scenarier där en app kräver ett separat område med anpassade resurser och Razor komponenter:

  • Skapa en mapp i appens Pages mapp för att lagra resurserna. Ett administratörsavsnitt i en app skapas till exempel i en ny mapp med namnet Admin (Pages/Admin).

  • Skapa en rotsida (_Host.cshtml) för området. Skapa till exempel en Pages/Admin/_Host.cshtml fil från appens huvudrotsida (Pages/_Host.cshtml). Ge inte ett @page-direktiv på Admin _Host-sidan.

  • Lägg till en layout i områdets mapp (till exempel Pages/Admin/_Layout.razor). I layouten för det separata området anger du taggen <base>href så att den matchar områdets mapp (till exempel <base href="/Admin/" />). I demonstrationssyfte lägger du till ~/ till de statiska resurserna på sidan. Till exempel:

    • ~/css/bootstrap/bootstrap.min.css
    • ~/css/site.css
    • ~/BlazorSample.styles.css (exempelappens namnområde är BlazorSample)
    • ~/_framework/blazor.server.js (Blazor skript)
  • Om området ska ha en egen statisk tillgångsmapp lägger du till mappen och anger dess plats till Static File Middleware i Program.cs (till exempel app.UseStaticFiles("/Admin/wwwroot")).

  • Razor-komponenterna läggs till i områdets mapp. Lägg åtminstone till Index-komponenten i områdesmappen med det rätta @page-direktivet för området. Lägg till exempel till en Pages/Admin/Index.razor fil baserat på appens standardfil Pages/Index.razor. Ange administrationsområdet som routningsmall överst i filen (@page "/admin"). Lägg till ytterligare komponenter efter behov. Till exempel Pages/Admin/Component1.razor med ett @page-direktiv och en vägmall för @page "/admin/component1.

  • I Program.csanropar du MapFallbackToPage för områdets sökväg för begäran omedelbart före rotsidans återställningssökväg till _Host-sidan:

    ...
    app.UseRouting();
    
    app.MapBlazorHub();
    app.MapFallbackToPage("~/Admin/{*clientroutes:nonfile}", "/Admin/_Host");
    app.MapFallbackToPage("/_Host");
    
    app.Run();
    

Hantera flera Blazor WebAssembly-appar

Mer information om hur du värdar flera Blazor WebAssembly-appar i en värdbaserad Blazor,-baserad lösningfinns i , se Flera värdbaserade ASP.NET Core Blazor WebAssembly-appar.

Driftsättning

Information om distribution finns i följande avsnitt: