Konak ve dağıtım ASP.NET Core Blazor WebAssembly

Barındırma Blazor WebAssembly modeli ile:

  • Uygulama, Blazor bağımlılıkları ve .NET çalışma zamanı tarayıcıya paralel olarak indirilir.
  • Uygulama doğrudan tarayıcı kullanıcı arabirimi iş parçacığında yürütülür.

Aşağıdaki dağıtım stratejileri de desteklenmeleridir:

  • Uygulama Blazor bir uygulama tarafından ASP.NET Core. Bu strateji, ASP.NET Core ile barındırılan dağıtım bölümünde ele almaktadır.
  • Uygulama, uygulamaya hizmet vermek için .NET'in kullanılmay olduğu statik bir barındırma Blazor web sunucusuna veya hizmetine Blazor yerleştirilir. Bu strateji, bir uygulamayı IIS alt uygulaması olarak barındırma hakkında bilgi içeren Tek başına dağıtım bölümünde Blazor WebAssembly ele almaktadır.

Zamanından (AOT) derleme

Blazor WebAssembly , .NET kodunuzu doğrudan WebAssembly'ye derleyebilirsiniz zamanından (AOT)derlemeyi destekler. AOT derlemesi, daha büyük bir uygulama boyutu için çalışma zamanı performans geliştirmeleri ile sonuç verir.

AOT derlemesini etkinleştirmeden, uygulamalar WebAssembly'de uygulanan bir .NET Ara Dil (IL) yorumlayıcı kullanarak Blazor WebAssembly tarayıcıda çalışır. .NET kodu yorumlanması nedeniyle, uygulamalar genellikle sunucu tarafı bir .NET tam zamanında (JIT)çalışma zamanı üzerinde olduğundan daha yavaş çalışır. AOT derlemesi, tarayıcı tarafından yerel WebAssembly yürütmesi için bir uygulamanın .NET kodunu doğrudan WebAssembly'ye derleerek bu performans sorununa giderir. AOT performans geliştirmesi, YOĞUN CPU kullanımına sahip görevler yürüten uygulamalar için önemli geliştirmeler gerçekleştirebilir. AOT derlemesini kullanmanın dezavantajı, AOT ile derlenmiş uygulamaların genellikle IL tarafından yorumlandırıldıklarından daha büyük olmasıdır, bu nedenle genellikle ilk istekte bulunduklarında istemciye indirilemeleri daha uzun sürer.

WebAssembly AOT derlemesini etkinleştirmek için, olarak ayarlanmış özelliği <RunAOTCompilation> true Blazor WebAssembly uygulamanın proje dosyasına ekleyin:

<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>

Uygulamayı WebAssembly'de derlemek için uygulamayı yayımlayın. Yapılandırmayı yayımlamak, yayımlanan uygulamanın boyutunu azaltmak için .NET Ara Dil Release (IL) bağlamanın da yapılandırmasını çalıştırmasını sağlar:

dotnet publish -c Release

WebAssembly AOT derlemesi yalnızca proje yayımlanırken gerçekleştirilir. AOT derlemesi genellikle küçük projelerde birkaç dakika, büyük projeler için ise çok daha uzun olduğundan, proje geliştirme sırasında (ortam) çalıştır olduğunda Development AOT derlemesi kullanılmaz. AOT derlemesi için derleme süresini azaltmak, gelecekteki sürümler için geliştirme aşamasında ASP.NET Core.

AOT ile derlenmiş bir uygulamanın boyutu genellikle .NET IL içine Blazor WebAssembly derlenmişse uygulamanın boyutundan büyüktür. Boyut farkı uygulamaya bağlı olsa da, AOT ile derlenmiş uygulamaların çoğu IL ile derlenmiş sürümlerinin yaklaşık iki katıdır. Bu, AOT derlemesini kullanmanın çalışma zamanı performansı için yük süresi performansını dengelemesi anlamına gelir. Bu takasın AOT derlemesi kullanmaya değer olup olmadığı uygulamanıza bağlıdır. Blazor WebAssembly yoğun CPU kullanımına sahip uygulamalar genellikle AOT derlemeden en iyi şekilde yararlanabilir.

Çalışma zamanı yeniden bağlantı

Bir uygulamanın en büyük parçalarından biri, uygulamaya kullanıcının tarayıcısı tarafından ilk kez erişilirken tarayıcının indirmesi gereken Blazor WebAssembly WebAssembly tabanlı .NET çalışma zamanıdır ( dotnet.wasm ). .NET WebAssembly çalışma zamanının yeniden bağlantısı, kullanılmayan çalışma zamanı kodunu kırparak indirme hızını iyiler.

Çalışma zamanı yeniden bağlantı, bir uygulamayı yayımlasanız otomatik olarak gerçekleştirilir. Genelleştirmeyi devre dışı bırakarak boyut azaltma özellikle önemli bir durumdur. Daha fazla bilgi için bkz. ASP.NET Core Blazor Genelleştirme ve yerelleştirme.

Yerel bağımlılıklar desteği

Blazor WebAssembly uygulamaları WebAssembly üzerinde çalıştırmak için yerleşik yerel bağımlılıkları kullanabilir. .NET WebAssembly derleme araçlarını kullanarak yerel bağımlılıkları .NET WebAssembly çalışma zamanının içine statik olarak bağ hale getirebilirsiniz. Aynı araçlar önceden bir uygulamayı WebAssembly'ye derlemek veya kullanılmayan özellikleri kaldırmak için çalışma zamanını yeniden bağlantılı hale Blazor getirebilirsiniz.

.NET WebAssembly derleme araçları, web platformu için bir derleyici araçlık olan Emscripten'itemel almaktadır. .NET WebAssembly derleme araçlarını yüklemek için aşağıdaki yaklaşımlardan birini kullanın:

  • Uygulama yükleyicisinde isteğe bağlı Visual Studio seçin.
  • Yönetici dotnet workload install wasm-tools komut isteminden komutunu çalıştırın.

Uygulamanın proje dosyasına Blazor WebAssembly öğeler ekleyerek uygulamaya yerel <NativeFileReference> bağımlılıklar ekleyin. Proje derlenmiş olduğunda, her biri .NET WebAssembly derleme araçları tarafından Emscripten'e geçirerek derlenmiş ve çalışma <NativeFileReference> zamanıyla bağlantılı olur. Ardından p/invoke uygulamanın .NET kodundaki yerel koda girin.

Genel olarak, herhangi bir taşınabilir yerel kod ile yerel bağımlılık olarak Blazor WebAssembly kullanılabilir. C/C++ koduna veya daha önce Emscripten kullanarak derlenmiş koda yerel bağımlılıklar eklemek için:

  • Nesne dosyaları ( .o )
  • Arşiv dosyaları ( .a )
  • Bitcode ( .bc )
  • Tek Başına WebAssembly modülleri ( .wasm )

Önceden oluşturulmuş bağımlılıklar genellikle .NET WebAssembly çalışma zamanının derlemek için kullanılan Aynı Emscripten sürümü kullanılarak oluşturulmuş olmalıdır.

Yerel kod kullanma

Uygulamaya basit bir yerel C işlevi Blazor WebAssembly ekleyin:

  1. Yeni bir proje Blazor WebAssembly oluşturun.

  2. Projeye Test.c bir dosya ekleyin.

  3. Bilgi işlem faktöri için içinde bir C Test.c işlevi ekleyin:

    int fact(int n)
    {
        if (n == 0) return 1;
        return n * fact(n - 1);
    }
    
  4. Uygulamanın <NativeFileReference> Test.c proje dosyasına bir ekleyin:

    <ItemGroup>
      <NativeFileReference Include="Test.c" />
    </ItemGroup>
    
  5. Bir bileşende ( ), oluşturulan kitaplıkta işlevi için bir ekleyin ve Razor .razor DllImportAttribute fact Test bileşeninde fact .NET kodundan yöntemini arayın:

    @using System.Runtime.InteropServices
    
    <p>@fact(3)</p>
    
    @code {
        [DllImport("Test")]
        static extern int fact(int n);
    }
    

Uygulamayı .NET WebAssembly derleme araçları yüklü olarak derlemeniz, yerel C kodu derlenmiş ve .NET WebAssembly çalışma zamanının () içine bağlanmış dotnet.wasm olur. Derleme ve bağlama birkaç dakika sürebilir. Uygulama oluşturulurken, işlenmiş faktör değeri görmek için uygulamayı çalıştırın.

Kitaplıkları kullanma

NuGet paketleri WebAssembly'de kullanım için yerel bağımlılıklar içerebilir. Bu kitaplıklar ve bunların yerel işlevleri daha sonra herhangi bir uygulama tarafından Blazor WebAssembly kullanılabilir. Yerel bağımlılıkların dosyaları WebAssembly için oluşturmalı ve mimariye özgü browser-wasm klasöründe paketlebildi. WebAssembly'ye özgü bağımlılıklara otomatik olarak başvurulmaz ve öğe olarak el ile <NativeFileReference> başvurulları gerekir. Paket yazarları, başvurular içeren bir dosyayı pakete dahil .props etmek için yerel başvuruları eklemeyi seçebilir.

SkiaSharp, yerel Skia grafik kitaplığını temel alan .NET için platformlar arası bir 2D grafik kitaplığıdırve artık için önizleme desteğine Blazor WebAssembly sahiptir.

Uyarı

SkiaSharp ve Skia grafik kitaplığı Microsoft'un sahip olduğu veya bakımını yapan bir kitaplık değil. Bu bölümdeki tanıtım örneği Microsoft tarafından desteklenmez ve üretimde kullanılmaması gerekir.

Bir uygulamada SkiaSharp kullanmak Blazor WebAssembly için:

  1. Bir projedeki SkiaSharp.Views.Blazor pakete paket başvurusu Blazor WebAssembly ekleyin. Bir Visual Studio paket ekleme işlemini kullanın ( NuGet Paketlerini Yönet) veya komutu komut dotnet add package kabuğunda yürütün:

    dotnet add package –-prerelease SkiaSharp.Views.Blazor
    

    Not

    Paketin yaz olduğu SkiaSharp.Views.Blazor sırada, paket üretim kullanımına yönelik NuGet bir ön kullanım paketidir.

  2. Uygulamaya SKCanvasView aşağıdakilerle bir bileşen ekleyin:

    • SkiaSharp ve SkiaSharp.Views.Blazor ad alanları.
    • SkiaSharp Tuval Görünümü bileşeninde çizme mantığı ( SKCanvasView ).

    Pages/NativeDependencyExample.razor:

    @page "/native-dependency-example"
    @using SkiaSharp
    @using SkiaSharp.Views.Blazor
    
    <PageTitle>Native dependency</PageTitle>
    
    <h1>Native dependency example with SkiaSharp</h1>
    
    <SKCanvasView OnPaintSurface="OnPaintSurface" />
    
    @code {
        private void OnPaintSurface(SKPaintSurfaceEventArgs e)
        {
            var canvas = e.Surface.Canvas;
            canvas.Clear(SKColors.White);
            using var paint = new SKPaint
            {
                Color = SKColors.Black,
                IsAntialias = true,
                TextSize = 24
            };
            canvas.DrawText("SkiaSharp", 0, 24, paint);
        }
    }
    
  3. Uygulamayı derlemek birkaç dakika sürebilir. Uygulamayı çalıştırın ve üzerinden NativeDependencyExample bileşene /native-dependency-example gidin.

Önyükleme kaynaklarının nasıl yükleniyor olduğunu özelleştirme

API kullanarak önyükleme kaynaklarının nasıl yükleniyor olduğunu loadBootResource özelleştirin. Daha fazla bilgi için bkz. ASP.NET Core Blazor Başlangıç.

Sıkıştırma

Bir uygulama yayımlanırken, uygulamanın boyutunu azaltmak ve çalışma zamanı sıkıştırma yükünü kaldırmak için yayımlama sırasında Blazor WebAssembly çıkış statik olarak sıkıştırılır. Aşağıdaki sıkıştırma algoritmaları kullanılır:

Blazor , uygun sıkıştırılmış dosyaları hizmet etmek için ana bilgisayarı kullanır. Barındırılan bir ASP.NET Core kullanırken, konak projesi içerik anlaşması yapabilir ve statik olarak sıkıştırılmış dosyalara hizmet yapabilir. Tek başına Blazor WebAssembly bir uygulama barındırılırken, statik olarak sıkıştırılmış dosyaların hizmet olduğundan emin olmak için ek çalışma gerekebilir:

  • IIS sıkıştırma web.config yapılandırması için IIS: Brotli ve Gzip sıkıştırma bölümüne bakın.

  • GitHub Pages gibi statik olarak sıkıştırılmış dosya içeriği anlaşmasını desteklemeen statik barındırma çözümlerini barındırıyorsanız, uygulamayı Brotli sıkıştırılmış dosyalarını getirmek ve kodunu çözmek için yapılandırmayı göz önünde bulun:

    • google/brotli deposundan JavaScript Brotli kod çözücüs GitHub alın. Minimum kod çözücü dosyası olarak decode.min.js adlandırılmıştır ve deponun klasöründe js bulunur.

      Not

      Betiğin en küçük decode.js sürümü ( ) başarısız decode.min.js olursa, bunun yerine belirlenemeyen sürümü ( decode.js ) kullanmayı deneyin.

    • Kodu çözücü kullanmak için uygulamayı güncelleştirin.

      Dosyasında, wwwroot/index.html autostart false etiketinde olarak Blazor <script> ayarlayın:

      <script src="_framework/blazor.webassembly.js" autostart="false"></script>
      

      Blazoretiketinin <script> ardından ve kapanış </body> etiketinin önünde aşağıdaki JavaScript kod bloğuna <script> ekleyin:

      <script type="module">
        import { BrotliDecode } from './decode.min.js';
        Blazor.start({
          loadBootResource: function (type, name, defaultUri, integrity) {
            if (type !== 'dotnetjs' && location.hostname !== 'localhost') {
              return (async function () {
                const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
                if (!response.ok) {
                  throw new Error(response.statusText);
                }
                const originalResponseBuffer = await response.arrayBuffer();
                const originalResponseArray = new Int8Array(originalResponseBuffer);
                const decompressedResponseArray = BrotliDecode(originalResponseArray);
                const contentType = type === 
                  'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
                return new Response(decompressedResponseArray, 
                  { headers: { 'content-type': contentType } });
              })();
            }
          }
        });
      </script>
      

      Önyükleme kaynaklarını yükleme hakkında daha fazla bilgi için bkz ASP.NET Core Blazor Başlangıç ..

sıkıştırmayı devre dışı bırakmak için BlazorEnableCompression MSBuild özelliğini uygulamanın proje dosyasına ekleyin ve değeri şu şekilde ayarlayın false :

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

BlazorEnableCompressionÖzelliği dotnet publish komut kabuğunda aşağıdaki söz dizimi ile komuta geçirilebilir:

dotnet publish -p:BlazorEnableCompression=false

Doğru yönlendirme için URL 'Leri yeniden yazın

Bir uygulamadaki sayfa bileşenlerine yönelik yönlendirme istekleri Blazor WebAssembly , barındırılan bir uygulamadaki yönlendirme istekleri kadar basittir Blazor Server . Blazor WebAssemblyİki bileşeni olan bir uygulamayı göz önünde bulundurun:

  • Main.razor: Uygulamanın köküne yükler ve About bileşene () bir bağlantı içerir href="About" .
  • About.razor: About bileşen.

Uygulamanın varsayılan belgesi, tarayıcının adres çubuğu kullanılarak istendiğinde (örneğin, https://www.contoso.com/ ):

  1. Tarayıcı bir istek yapar.
  2. Varsayılan sayfa döndürülür, genellikle index.html .
  3. index.html uygulamayı önyükleme.
  4. Blazoruygulamasının yönlendirici yüklenir ve Razor Main bileşen işlenir.

Ana sayfada, About Blazor yönlendirici tarayıcıyı Internet 'te için bir istek yapmayı durdurduğundan www.contoso.com About ve Işlenmiş About bileşenin kendisini sunan ana sayfada, istemci üzerinde çalışır. Blazor WebAssembly Uygulamadaki iç uç noktalara yönelik tüm istekler aynı şekilde çalışır: istekler tarayıcı tabanlı istekleri Internet 'teki sunucu tarafından barındırılan kaynaklara tetiklemez. Yönlendirici istekleri dahili olarak işler.

Tarayıcının adres çubuğu kullanılarak bir istek yapılırsa www.contoso.com/About , istek başarısız olur. Uygulamanın Internet ana bilgisayarında böyle bir kaynak yok, bu nedenle 404-bulunamayan bir yanıt döndürülür.

Tarayıcılar, istemci tarafı sayfaları için Internet tabanlı konaklara istek yaptığından, Web sunucuları ve barındırma hizmetleri sunucuda fiziksel olarak olmayan tüm kaynak isteklerini sayfaya yeniden yazması gerekir index.html . index.htmlDöndürüldüğünde, uygulamanın Blazor yönlendiricisi doğru kaynakla sürer ve yanıt verir.

Bir IIS sunucusuna dağıtım yaparken, URL yeniden yazma modülünü uygulamanın yayımlanan dosyasıyla birlikte kullanabilirsiniz web.config . Daha fazla bilgi için IIS bölümüne bakın.

ASP.NET Core ile barındırılan dağıtım

barındırılan bir dağıtım , Blazor WebAssembly uygulamayı bir web sunucusu üzerinde çalışan bir ASP.NET Core uygulamasından tarayıcılarına sunar.

İstemci uygulaması, sunucu uygulamasının Blazor WebAssembly /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot diğer statik Web varlıklarıyla birlikte sunucu uygulamasının klasörüne yayımlanır. İki uygulama birlikte dağıtılır. ASP.NET Core uygulamasını barındırabilen bir web sunucusu gereklidir. barındırılan bir dağıtım için Visual Studio, ( Blazor WebAssembly blazorwasm dotnet new Hosted -ho|--hosted dotnet new komutunu kullanırken) uygulama proje şablonunu (komutunu kullanırken şablon) içerir.

Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Birden çok uygulama ile barındırılan dağıtım Blazor WebAssembly

Uygulama yapılandırması

Barındırılan Blazor çözümler birden çok Blazor WebAssembly uygulamayı kullanabilir.

Not

bu bölümdeki örnek, Visual Studio çözümünün kullanımına başvurur, ancak birden fazla istemci uygulamasının barındırılan uygulamalar senaryosunda çalışması için Visual Studio ve Visual Studio çözümünün kullanılması gerekmez Blazor WebAssembly . Visual Studio kullanmıyorsanız, {SOLUTION NAME}.sln dosyayı ve Visual Studio oluşturulan diğer dosyaları yoksayın.

Aşağıdaki örnekte:

  • İlk (ilk) istemci uygulaması, proje şablonundan oluşturulan bir çözümün varsayılan istemci projem Blazor WebAssembly . İlk istemci uygulamasına, /FirstApp bağlantı noktası 5001 ya da bir KONAĞıNDAN URL 'den bir tarayıcıda erişilebilir firstapp.com .
  • Çözüme ikinci bir istemci uygulaması eklenir SecondBlazorApp.Client . İkinci istemci uygulamasına, /SecondApp bağlantı noktası 5002 ya da bir KONAĞıNDAN URL 'den bir tarayıcıda erişilebilir secondapp.com .

BlazorBarındırılan proje şablonundan mevcut bir barındırılan çözümü kullanın veya yeni bir çözüm oluşturun Blazor :

  • İstemci uygulamasının proje dosyasında, <StaticWebAssetBasePath> <PropertyGroup> FirstApp projenin statik varlıkların temel yolunu ayarlamak için değeri ile öğesine bir özelliği ekleyin:

    <PropertyGroup>
      ...
      <StaticWebAssetBasePath>FirstApp</StaticWebAssetBasePath>
    </PropertyGroup>
    
  • Çözüme ikinci bir istemci uygulaması ekleyin:

    • Çözümün klasörüne adlı bir klasör ekleyin SecondClient . Proje şablonundan oluşturulan çözüm klasörü, klasör eklendikten sonra aşağıdaki çözüm dosya ve klasörlerini içerir SecondClient :

      • Client klasörde
      • SecondClient klasörde
      • Server klasörde
      • Shared klasörde
      • {SOLUTION NAME}.sln dosyasýný

      Yer tutucu {SOLUTION NAME} çözümün adıdır.

    • Blazor WebAssembly SecondBlazorApp.Client SecondClient Proje şablonundan klasöründe adlı bir uygulama oluşturun Blazor WebAssembly .

    • SecondBlazorApp.ClientUygulamanın proje dosyasında:

      • <StaticWebAssetBasePath>Değerine sahip öğesine bir özelliği ekleyin <PropertyGroup> SecondApp :

        <PropertyGroup>
          ...
          <StaticWebAssetBasePath>SecondApp</StaticWebAssetBasePath>
        </PropertyGroup>
        
      • Projeye bir proje başvurusu ekleyin Shared :

        <ItemGroup>
          <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
        </ItemGroup>
        

        Yer tutucu {SOLUTION NAME} çözümün adıdır.

  • Sunucu uygulamasının proje dosyasında, eklenen istemci uygulaması için bir proje başvurusu oluşturun SecondBlazorApp.Client :

    <ItemGroup>
      <ProjectReference Include="..\Client\{SOLUTION NAME}.Client.csproj" />
      <ProjectReference Include="..\SecondClient\SecondBlazorApp.Client.csproj" />
      <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
    </ItemGroup>
    

    Yer tutucu {SOLUTION NAME} çözümün adıdır.

  • Sunucu uygulamasının Properties/launchSettings.json dosyasında, applicationUrl Kestrel {SOLUTION NAME}.Server 5001 ve 5002 bağlantı noktalarında istemci uygulamalarına erişmek için profilin () yapılandırmasını yapılandırın:

    "applicationUrl": "https://localhost:5001;https://localhost:5002",
    
  • Sunucu uygulamasının Program.cs dosyasında, çağrısından sonra görünen aşağıdaki satırları kaldırın UseHttpsRedirection :

    -app.UseBlazorFrameworkFiles();
    -app.UseStaticFiles();
    
    -app.UseRouting();
    
    -app.MapRazorPages();
    -app.MapControllers();
    -app.MapFallbackToFile("index.html");
    

    İstekleri istemci uygulamalarına eşleyen ara yazılım ekleme. Aşağıdaki örnek, şu durumlarda ara yazılımı çalıştıracak şekilde yapılandırır:

    • İstek bağlantı noktası, özgün istemci uygulaması için 5001 ya da eklenen istemci uygulaması için 5002 ' dir.

    • İstek Konağı, firstapp.com özgün istemci uygulaması ya da secondapp.com eklenen istemci uygulaması için.

      Not

      Bu bölümde gösterilen örnekte, için ek yapılandırma gerekir:

      • Örnek ana bilgisayar etki alanlarındaki uygulamalara erişme firstapp.com ve secondapp.com .
      • TLS güvenliğini etkinleştirmek için istemci uygulamalarına yönelik Sertifikalar (HTTPS).

      Gerekli yapılandırma Bu makalenin kapsamı dışındadır ve çözümün nasıl barındırıldığını bağlıdır. Daha fazla bilgi için bkz. konak ve dağıtım makaleleri.

    Aşağıdaki kodu satırların daha önce kaldırıldığı yere yerleştirin:

    app.MapWhen(ctx => ctx.Request.Host.Port == 5001 || 
        ctx.Request.Host.Equals("firstapp.com"), first =>
    {
        first.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/FirstApp" + ctx.Request.Path;
            return nxt();
        });
    
        first.UseBlazorFrameworkFiles("/FirstApp");
        first.UseStaticFiles();
        first.UseStaticFiles("/FirstApp");
        first.UseRouting();
    
        first.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/FirstApp/{*path:nonfile}", 
                "FirstApp/index.html");
        });
    });
    
    app.MapWhen(ctx => ctx.Request.Host.Port == 5002 || 
        ctx.Request.Host.Equals("secondapp.com"), second =>
    {
        second.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/SecondApp" + ctx.Request.Path;
            return nxt();
        });
    
        second.UseBlazorFrameworkFiles("/SecondApp");
        second.UseStaticFiles();
        second.UseStaticFiles("/SecondApp");
        second.UseRouting();
    
        second.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/SecondApp/{*path:nonfile}", 
                "SecondApp/index.html");
        });
    });
    

    Hakkında daha fazla bilgi için UseStaticFiles bkz ASP.NET Core Blazor statik dosyalar ..

    Ve hakkında daha fazla bilgi için UseBlazorFrameworkFiles MapFallbackToFile aşağıdaki kaynaklara bakın:

    Not

    Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal main ASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Core release/5.0 5.0 sürümü için dalı seçin.

  • Sunucu uygulamasının Hava durumu tahmin denetleyicisi 'nde ( Controllers/WeatherForecastController.cs ), var olan yolu ( [Route("[controller]")] ) WeatherForecastController aşağıdaki yollarla değiştirin:

    [Route("FirstApp/[controller]")]
    [Route("SecondApp/[controller]")]
    

    Sunucu uygulamasının istek işleme işlem hattına eklenen ara yazılım, gelen istekleri /WeatherForecast /FirstApp/WeatherForecast /SecondApp/WeatherForecast bağlantı noktasına (5001/5002) veya etki alanına () bağlı olarak ya da öğesine göre değiştirir firstapp.com / secondapp.com . Sunucu uygulamasından istemci uygulamalarına Hava durumu verilerini döndürmek için önceki denetleyici yolları gereklidir.

Birden çok uygulama için statik varlıklar ve sınıf kitaplıkları Blazor WebAssembly

Statik varlıklara başvurmak için aşağıdaki yaklaşımları kullanın:

  • Varlık, istemci uygulamasının wwwroot klasöründe olduğunda, yolu normal olarak belirtin:

    <img alt="..." src="/{PATH AND FILE NAME}" />
    

    {PATH AND FILE NAME}Yer tutucu, altında yol ve dosya adıdır wwwroot .

  • Varlık wwwroot bir Razor sınıf kitaplığı (RCL)klasöründe olduğunda, ' deki kılavuzluk uyarınca istemci uygulamasındaki statik varlığa başvurun Kullanıcı arabirimi ile Razor sınıf kitaplıklarında yeniden ASP.NET Core :

    <img alt="..." src="_content/{PACKAGE ID}/{PATH AND FILE NAME}" />
    

    {PACKAGE ID}Yer tutucu, kitaplığın paket kimliğidir. Proje dosyasında belirtilmemişse, paket KIMLIĞI varsayılan olarak projenin derleme adına sahiptir <PackageId> . {PATH AND FILE NAME}Yer tutucu, altında yol ve dosya adıdır wwwroot .

RCLs hakkında daha fazla bilgi için bkz.

Tek başına dağıtım

Tek başına dağıtım , Blazor WebAssembly uygulamaya doğrudan istemciler tarafından istenen statik dosyalar kümesi olarak hizmet verir. Herhangi bir statik dosya sunucusu, Blazor uygulamayı sunabilir.

Tek başına dağıtım varlıkları /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot klasörüne yayımlanır.

Azure App Service

Blazor WebAssemblyuygulamalar, uygulamayı ııs'de barındıran Windows Azure app Services 'a dağıtılabilir.

Tek başına bir Blazor WebAssembly uygulamanın Linux için Azure App Service dağıtımı şu anda desteklenmemektedir. Uygulamayı barındıracak bir Linux sunucu görüntüsü şu anda kullanılamıyor. Bu senaryoyu etkinleştirmek için iş devam ediyor.

Azure statik Web uygulaması

Daha fazla bilgi için bkz. öğretici: Blazor Azure statik Web Apps ile statik Web uygulaması oluşturma.

IIS

IIS, uygulamalar için özellikli bir statik dosya sunucusudur Blazor . IIS 'yi barındıracak şekilde yapılandırmak için Blazor bkz. IIS 'de statik Web sitesi oluşturma.

Yayımlanan varlıklar /bin/Release/{TARGET FRAMEWORK}/publish klasöründe oluşturulur. publishWeb sunucusunda veya barındırma hizmetinde klasörün içeriğini barındırın.

web.config

Bir Blazor Proje yayımlandığında, web.config aşağıdaki IIS yapılandırmasıyla bir dosya oluşturulur:

  • MIME türleri
  • Aşağıdaki MIME türleri için HTTP sıkıştırması etkindir:
    • application/octet-stream
    • application/wasm
  • URL yeniden yazma modülü kuralları oluşturuldu:
    • Uygulamanın statik varlıklarının bulunduğu alt dizini ( wwwroot/{PATH REQUESTED} ) sunar.
    • Dosya olmayan varlıklar için isteklerin statik varlıklar klasöründe () uygulamanın varsayılan belgesine yeniden yönlendirilmesi için SPA geri dönüş yönlendirmesi oluşturun wwwroot/index.html .

Özel bir web.config kullanma

Özel bir dosya kullanmak için web.config , özel web.config dosyayı proje klasörünün köküne yerleştirin. Projeyi uygulamanın proje dosyasında kullanarak IIS 'e özgü varlıkları yayımlayacak şekilde yapılandırın PublishIISAssets ve projeyi yayımlayın:

<PropertyGroup>
  <PublishIISAssets>true</PublishIISAssets>
</PropertyGroup>

URL yeniden yazma modülünü yükler

URL yeniden yazma modülü , URL 'leri yeniden yazmak için gereklidir. Modül varsayılan olarak yüklenmez ve bir Web sunucusu (IIS) rol hizmeti özelliği olarak yükleme için kullanılamaz. Modül IIS Web sitesinden indirilmelidir. Modülünü yüklemek için Web Platformu Yükleyicisi 'ni kullanın:

  1. Yerel olarak, URL yeniden yazma modülü İndirmeleri sayfasınagidin. Ingilizce sürümünde, WebPI yükleyicisini indirmek için WebPI ' ı seçin. Diğer diller için, yükleyiciyi indirmek üzere sunucu için uygun mimariyi (x86/x64) seçin.
  2. Yükleyiciyi sunucuya kopyalayın. Yükleyiciyi çalıştırın. , Install düğmesini seçin ve lisans koşullarını kabul edin. Yüklemesi tamamlandıktan sonra sunucu yeniden başlatması gerekli değildir.

Web sitesini yapılandırma

Web sitesinin fiziksel yolunu uygulamanın klasörüne ayarlayın. Klasör şunları içerir:

  • web.configWeb sitesini yapılandırmak için gereken yeniden yönlendirme kuralları ve dosya içerik türleri dahil olmak üzere IIS tarafından kullanılan dosya.
  • Uygulamanın statik varlık klasörü.

IIS alt uygulaması olarak barındırma

Tek başına bir uygulama bir IIS alt uygulaması olarak barındırılıyorsa, aşağıdakilerden birini yapın:

  • devralınan ASP.NET Core modülü işleyicisini devre dışı bırakın.

    Blazor web.config Dosyanın bölümüne bir bölüm ekleyerek uygulamanın yayımlanan dosyasındaki işleyiciyi kaldırın <handlers> <system.webServer> :

    <handlers>
      <remove name="aspNetCore" />
    </handlers>
    
  • Şu <system.webServer> şekilde ayarlanmış bir öğe kullanarak kök (üst) uygulamanın devralınmasını devre dışı bırakın <location> inheritInChildApplications false :

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <handlers>
            <add name="aspNetCore" ... />
          </handlers>
          <aspNetCore ... />
        </system.webServer>
      </location>
    </configuration>
    

    Not

    Kök (üst) uygulama bölümünün devralınmasını devre dışı bırakmak, <system.webServer> .NET SDK kullanılarak yayımlanan uygulamalar için varsayılan yapılandırmadır.

İşleyicinin kaldırılması veya devralma devre dışı bırakılması, uygulamanın temel yolunun yapılandırılmasınaek olarak gerçekleştirilir. Uygulamanın dosyasındaki uygulama temel yolunu, index.html IIS 'de alt uygulamayı yapılandırırken kullanılan IIS diğer adına ayarlayın.

Brotli ve gzip sıkıştırması

bu bölüm yalnızca tek başına uygulamalar için geçerlidir Blazor WebAssembly . barındırılan Blazor uygulamalar web.config , bu bölümde bağlantılı dosyayı değil, varsayılan bir ASP.NET Core uygulama dosyası kullanır.

IIS, web.config Blazor tek başına uygulamalar için Brotli veya gzip ile sıkıştırılmış varlıklar sunacak şekilde yapılandırılabilir Blazor WebAssembly . Örnek bir yapılandırma dosyası için bkz web.config ..

Örnek dosyanın ek yapılandırması web.config aşağıdaki senaryolarda gerekli olabilir:

  • Uygulamanın belirtimi aşağıdakilerden birini çağırır:
    • Örnek dosya tarafından yapılandırılmayan sıkıştırılmış dosyalara hizmet sunma web.config .
    • Sıkıştırılmış dosyalara, sıkıştırılmamış biçimde örnek dosya tarafından yapılandırılmış olarak sunma web.config .
  • Sunucunun IIS yapılandırması (örneğin, applicationHost.config ) sunucu DÜZEYINDE IIS Varsayılanları sağlar. Sunucu düzeyindeki yapılandırmaya bağlı olarak, uygulama örnek dosyanın içerenden farklı bir IIS yapılandırması gerektirebilir web.config .

Sorun giderme

500-Iç sunucu hatası ALıNMıŞSA ve IIS Yöneticisi Web sitesinin yapılandırmasına erişmeye çalışırken hatalar OLUŞTURURSA, URL yeniden yazma modülünün yüklü olduğunu doğrulayın. Modül yüklü olmadığında, web.config Dosya IIS tarafından ayrıştırılamaz. Bu, IIS yöneticisinin Web sitesinin yapılandırmasını ve Web sitesini, statik dosyaları hizmet olarak yüklemesini engeller Blazor .

IIS ile dağıtım sorunlarını giderme hakkında daha fazla bilgi için bkz Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme ..

Azure Storage

Azure Depolama statik dosya barındırma sunucusuz Blazor uygulama barındırılmasına olanak sağlar. özel etki alanı adları, Azure Content Delivery Network (CDN) ve HTTPS desteklenir.

Blob hizmeti bir depolama hesabında barındırılan statik Web sitesi için etkinleştirildiğinde:

  • Dizin belgesi adını olarak ayarlayın index.html .
  • Hata belge yolunu olarak ayarlayın index.html . Razor bileşenler ve diğer dosya olmayan uç noktaları, blob hizmeti tarafından depolanan statik içerikte fiziksel yollarda yer vermez. Yönlendiricinin işlemesi gereken bu kaynaklardan birine yönelik bir istek alındığında Blazor , blob hizmeti tarafından oluşturulan 404-bulunamayan hata, isteği hata belge yoluna yönlendirir. index.htmlBLOB döndürülür ve Blazor yönlendirici yolu yükler ve işler.

Dosyalar ' üst bilgilerinde uygunsuz MIME türleri nedeniyle çalışma zamanında dosya yüklenmemişse Content-Type , aşağıdaki eylemlerden birini gerçekleştirin:

  • Araçlar, dosyalar dağıtıldığında doğru MIME türlerini (üstbilgiler) ayarlamak üzere yapılandırın Content-Type .

  • Content-TypeUygulama dağıtıldıktan sonra dosyalar IÇIN MIME türlerini (üstbilgiler) değiştirin.

    her dosya için Depolama Gezgini (Azure portal):

    1. Dosyaya sağ tıklayın ve Özellikler’i seçin.
    2. ContentType ' ı ayarlayın ve Kaydet düğmesini seçin.

daha fazla bilgi için bkz. Azure Depolama 'de statik web sitesi barındırma.

Nginx

Aşağıdaki nginx.conf Dosya, NGINX 'in index.html diskteki karşılık gelen bir dosyayı bulamadığı her seferinde dosyayı göndermek üzere nasıl yapılandırılacağını göstermek için basitleştirilmiştir.

events { }
http {
    server {
        listen 80;

        location / {
            root      /usr/share/nginx/html;
            try_files $uri $uri/ /index.html =404;
        }
    }
}

NGINX veri bloğu hızı sınırı ile ayarlandığında limit_req , Blazor WebAssembly uygulamalar burst bir uygulama tarafından yapılan görece çok sayıda isteği karşılamak için büyük bir parametre değeri gerektirebilir. Başlangıçta değeri en az 60 olarak ayarlayın:

http {
    server {
        ...

        location / {
            ...

            limit_req zone=one burst=60 nodelay;
        }
    }
}

Tarayıcı geliştirici araçları veya ağ trafiği Aracı, isteklerin 503 servis dışı bir durum kodu aldığını gösteriyorsa değeri artırın.

Üretim NGINX web sunucusu yapılandırması hakkında daha fazla bilgi için bkz. NGINX Plus ve NGINX yapılandırma dosyaları oluşturma.

Apache

Bir Blazor WebAssembly uygulamayı CentOS 7 veya sonraki bir sürüme dağıtmak için:

  1. Apache yapılandırma dosyasını oluşturun. Aşağıdaki örnek, Basitleştirilmiş bir yapılandırma dosyasıdır ( blazorapp.config ):

    <VirtualHost *:80>
        ServerName www.example.com
        ServerAlias *.example.com
    
        DocumentRoot "/var/www/blazorapp"
        ErrorDocument 404 /index.html
    
        AddType application/wasm .wasm
        AddType application/octet-stream .dll
    
        <Directory "/var/www/blazorapp">
            Options -Indexes
            AllowOverride None
        </Directory>
    
        <IfModule mod_deflate.c>
            AddOutputFilterByType DEFLATE text/css
            AddOutputFilterByType DEFLATE application/javascript
            AddOutputFilterByType DEFLATE text/html
            AddOutputFilterByType DEFLATE application/octet-stream
            AddOutputFilterByType DEFLATE application/wasm
            <IfModule mod_setenvif.c>
          BrowserMatch ^Mozilla/4 gzip-only-text/html
          BrowserMatch ^Mozilla/4.0[678] no-gzip
          BrowserMatch bMSIE !no-gzip !gzip-only-text/html
      </IfModule>
        </IfModule>
    
        ErrorLog /var/log/httpd/blazorapp-error.log
        CustomLog /var/log/httpd/blazorapp-access.log common
    </VirtualHost>
    
  2. Apache yapılandırma dosyasını /etc/httpd/conf.d/ , CentOS 7 ' de varsayılan Apache yapılandırma dizini olan dizine yerleştirin.

  3. Uygulamanın dosyalarını /var/www/blazorapp dizine yerleştirin ( DocumentRoot yapılandırma dosyasında belirtilen konum).

  4. Apache hizmetini yeniden başlatın.

Daha fazla bilgi için bkz mod_mime mod_deflate . ve.

GitHub Pages

URL yeniden işlemesini işlemek için, wwwroot/404.html isteği sayfaya yönlendirmeyi işleyen bir betiği olan bir dosya ekleyin index.html . bir örnek için bkz. stevesandersonms/ Blazor ongithubpages GitHub deposu:

Bir kuruluş sitesi yerine bir proje sitesi kullanırken, <base> içindeki etiketini güncelleştirin wwwroot/index.html . hreföznitelik değerini, sondaki eğik çizgiyle (örneğin,) GitHub depo adına ayarlayın /my-repository/ . stevesandersonms/ Blazor ongithubpages GitHub deposunda, taban href .github/workflows/main.yml yapılandırma dosyasıtarafından yayımlama sırasında güncelleştirilir.

Not

stevesandersonms/ Blazor ongithubpages GitHub deposu , .net Foundation veya Microsoft tarafından sahip değil, korunmaz veya desteklenmez.

Ana bilgisayar yapılandırma değerleri

Blazor WebAssembly uygulamalar , geliştirme ortamındaki çalışma zamanında komut satırı bağımsız değişkenleri olarak aşağıdaki ana bilgisayar yapılandırma değerlerini kabul edebilir.

İçerik kökü

--contentrootBağımsız değişkeni, uygulamanın içerik dosyalarını (içerik kökü) içeren dizinin mutlak yolunu ayarlar. Aşağıdaki örneklerde, /content-root-path uygulamanın içerik kök yolu bulunur.

  • Uygulamayı bir komut isteminde yerel olarak çalıştırırken bağımsız değişkenini geçirin. Uygulamanın dizininden şunu yürütün:

    dotnet run --contentroot=/content-root-path
    
  • IIS Express profilindeki uygulamanın dosyasına bir giriş ekleyin launchSettings.json . bu ayar, uygulama Visual Studio hata ayıklayıcıyla ve ile bir komut isteminden çalıştırıldığında kullanılır dotnet run .

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • Visual Studio, özellikler > hata ayıklama > uygulama bağımsız değişkenlerinde bağımsız değişkenini belirtin. Visual Studio özellik sayfasında bağımsız değişkeni ayarlamak dosyaya bağımsız değişkeni ekler launchSettings.json .

    --contentroot=/content-root-path
    

Yol tabanı

--pathbaseBağımsız değişkeni, kök olmayan göreli BIR URL yoluyla yerel olarak çalışan bir uygulamanın uygulama temeli yolunu ayarlar ( <base> etiket, href / hazırlama ve üretim için dışında bir yola ayarlanır). Aşağıdaki örneklerde, /relative-URL-path uygulamanın yol tabanı bulunur. Daha fazla bilgi için bkz. uygulama temel yolu.

Önemli

Etiketinde belirtilen yolun aksine href <base> , / bağımsız değişken değeri geçirilirken sondaki eğik çizgi () eklemeyin --pathbase . Etikette uygulama temel yolu <base> <base href="/CoolApp/"> (sondaki eğik çizgi içeriyorsa) olarak sağlanmışsa, komut satırı bağımsız değişken değerini --pathbase=/CoolApp (sondaki eğik çizgi yok) olarak geçirin.

  • Uygulamayı bir komut isteminde yerel olarak çalıştırırken bağımsız değişkenini geçirin. Uygulamanın dizininden şunu yürütün:

    dotnet run --pathbase=/relative-URL-path
    
  • IIS Express profilindeki uygulamanın dosyasına bir giriş ekleyin launchSettings.json . bu ayar, uygulamayı Visual Studio hata ayıklayıcıyla ve ile bir komut isteminden çalıştırırken kullanılır dotnet run .

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • Visual Studio, özellikler > hata ayıklama > uygulama bağımsız değişkenlerinde bağımsız değişkenini belirtin. Visual Studio özellik sayfasında bağımsız değişkeni ayarlamak dosyaya bağımsız değişkeni ekler launchSettings.json .

    --pathbase=/relative-URL-path
    

URL’ler

--urlsBağımsız değişkeni, istekler için dinlemek üzere bağlantı noktaları ve protokollerle IP adreslerini veya konak adreslerini ayarlar.

  • Uygulamayı bir komut isteminde yerel olarak çalıştırırken bağımsız değişkenini geçirin. Uygulamanın dizininden şunu yürütün:

    dotnet run --urls=http://127.0.0.1:0
    
  • IIS Express profilindeki uygulamanın dosyasına bir giriş ekleyin launchSettings.json . bu ayar, uygulamayı Visual Studio hata ayıklayıcıyla ve ile bir komut isteminden çalıştırırken kullanılır dotnet run .

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • Visual Studio, özellikler > hata ayıklama > uygulama bağımsız değişkenlerinde bağımsız değişkenini belirtin. Visual Studio özellik sayfasında bağımsız değişkeni ayarlamak dosyaya bağımsız değişkeni ekler launchSettings.json .

    --urls=http://127.0.0.1:0
    

Kesiciyi yapılandırma

Blazor çıkış derlemelerinden gereksiz Il 'yi kaldırmak için her sürüm derlemesinde ara dil (IL) kırpılmasını gerçekleştirir. Daha fazla bilgi için bkz. Trimmer'i ASP.NET Core Blazor.

DLL dosyalarının dosya adı uzantısını değiştirme

Uygulamanın yayımlanmış dosyalarının dosya adı uzantılarını değiştirmeniz gerekiyorsa .dll , bu bölümdeki yönergeleri izleyin.

uygulamayı yayımladıktan sonra, .dll farklı bir dosya uzantısı kullanmak üzere dosyaları yeniden adlandırmak için bir kabuk betiği veya DevOps derleme işlem hattı kullanın. .dll wwwroot Uygulamanın yayınlanan çıktısının dizinindeki dosyaları hedefleyin (örneğin, {CONTENT ROOT}/bin/Release/netstandard2.1/publish/wwwroot ).

Aşağıdaki örneklerde .dll Dosyalar dosya uzantısını kullanacak şekilde yeniden adlandırılır .bin .

Windows'da:

dir .\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content .\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content .\_framework\blazor.boot.json

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

((Get-Content .\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content .\service-worker-assets.js

Linux veya macOS 'ta:

for f in _framework/_bin/*; do mv "$f" "`echo $f | sed -e 's/\.dll/.bin/g'`"; done
sed -i 's/\.dll"/.bin"/g' _framework/blazor.boot.json

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

sed -i 's/\.dll"/.bin"/g' service-worker-assets.js

Farklı bir dosya uzantısını kullanmak için .bin .bin Yukarıdaki komutlarda değiştirin.

Sıkıştırılmış blazor.boot.json.gz ve dosyaları çözmek için blazor.boot.json.br aşağıdaki yaklaşımlardan birini benimseyin:

  • Sıkıştırılmış blazor.boot.json.gz ve dosyaları kaldırın blazor.boot.json.br . Sıkıştırma bu yaklaşım ile devre dışı bırakıldı.
  • Güncelleştirilmiş dosyayı yeniden sıkıştırın blazor.boot.json .

Yukarıdaki kılavuz, hizmet çalışanı varlıkları kullanımda olduğunda da geçerlidir. Ve ' i kaldırın veya yeniden sıkıştırın wwwroot/service-worker-assets.js.br wwwroot/service-worker-assets.js.gz . Aksi halde, tarayıcıda dosya bütünlüğü denetimleri başarısız olur.

aşağıdaki Windows örnek, projenin köküne yerleştirilmiş bir PowerShell betiğini kullanır.

ChangeDLLExtensions.ps1::

param([string]$filepath,[string]$tfm)
dir $filepath\bin\Release\$tfm\wwwroot\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json.gz

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

((Get-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js

Proje dosyasında, komut dosyası uygulama yayımlandıktan sonra çalıştırılır:

<Target Name="ChangeDLLFileExtensions" AfterTargets="Publish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; { .\ChangeDLLExtensions.ps1 '$(SolutionDir)' '$(TargetFramework)'}&quot;" />
</Target>

Not

Aynı derlemeleri yeniden adlandırırken ve geç yüklerken, içindeki kılavuza bakın Derlemelerde yavaş yükleme derlemeleri ASP.NET Core Blazor WebAssembly .

Bütünlük denetimi başarısızlıklarını çözümleyin

Blazor WebAssemblyUygulamanın başlangıç dosyalarını indirdiğinde, tarayıcıya yanıtlar üzerinde bütünlük denetimleri gerçekleştirmesini söyler. blazor.boot.json .dll , Ve diğer dosyalar IÇIN beklenen SHA-256 karma değerlerini belirtmek için dosyadaki bilgileri kullanır .wasm . Bu, aşağıdaki nedenlerle faydalıdır:

  • Örneğin, Kullanıcı uygulama dosyalarını indirme sürecinde olduğunda, Web sunucunuza yeni bir dağıtım uygulanmışsa, tutarsız bir dosya kümesini yükleme riskini almanızı sağlar. Tutarsız dosyalar tanımsız davranışa yol açabilir.
  • Kullanıcının tarayıcısının hiçbir şekilde tutarsız veya geçersiz yanıtları önbelleklemesini sağlar, bu da sayfayı el ile yenilese bile uygulamayı başlatmalarını engelleyebilir.
  • Yanıtları önbelleğe alma işlemini güvenli hale getirir ve beklenen SHA-256 karmaları değişene kadar sunucu tarafı değişikliklerini kontrol etmez, sonraki sayfa yüklemeleri daha az istek içerir ve çok daha hızlı tamamlanır.

Web sunucunuz beklenen SHA-256 karmalarıyla eşleşmeyen yanıtlar döndürürse, tarayıcının geliştirici konsolunda aşağıdakine benzer bir hata görürsünüz:

https://myapp.example.com/\_framework/My Blazor Hesaplanan SHA-256 bütünlüğü ' IIa70iwvmEg5WiDV17OpQ5eCztNYqL186J56852RpJY = ' ile 'App.dll ' kaynağı için ' Integrity ' özniteliğinde geçerli bir Özet bulunamadı. Kaynak engellendi.

Çoğu durumda bu, bütünlük denetimi ile ilgili bir sorun değildir . Bunun yerine, başka bir sorun olduğu anlamına gelir ve bu sorunu gidermek için bütünlük denetimi size uyarı verebilir.

Bütünlük sorunlarını tanılama

Bir uygulama oluşturulduğunda, oluşturulan blazor.boot.json bildirim, derleme çıktısının oluşturulduğu sırada önyükleme KAYNAKLARıNıZıN SHA-256 karmalarını (örneğin,, .dll .wasm ve diğer dosyaları) açıklar. ' Deki SHA-256 karmaları blazor.boot.json tarayıcıya teslim edilen dosyalarla eşleştiği sürece bütünlük denetimi geçirilir.

Bunun başarısız olmasının yaygın nedenleri:

  • Web sunucusunun yanıtı, tarayıcı istenen dosya yerine bir hatadır (örneğin, bir 404-bulunamadı veya 500-Internal Server Error). Bu, tarayıcı tarafından bir bütünlük denetimi hatası olarak bildirilir ve yanıt hatası olarak değildir.
  • Dosya içeriğini tarayıcıya, dosyaların oluşturulması ve teslimi arasında değiştiren bir sorun. Bu durum oluşabilir:
    • Ya da yapı araçları derleme çıkışını el ile değiştirir.
    • Dağıtım işleminin bazı bir yönü dosyaları değiştirdiyseniz. örneğin, git tabanlı bir dağıtım mekanizması kullanıyorsanız, git 'in Windows üzerinde dosya oluşturup Linux 'ta kullanıma hazır olması durumunda git 'in Windows stili satır sonlarını şeffaf olarak unıx stili satır sonlarına dönüştürdüğünü göz önünde bulundurun. Dosya satır sonlarını değiştirmek için SHA-256 karmaları değiştirin. Bu sorundan kaçınmak için, .gitattributes Yapı yapıtlarını binary dosya olarak değerlendirmek üzerekullanmayı düşünün.
    • Web sunucusu, bu dosyaları sunma bölümünde dosya içeriğini değiştirir. Örneğin, bazı içerik dağıtım ağları (CDNs) otomatik olarak HTML 'yi küçültmeye çalışır ve bu sayede onu değiştirir. Bu tür özellikleri devre dışı bırakmanız gerekebilir.

Bu durumun hangi durumlarda geçerli olduğunu tanılamak için:

  1. Hatanın hata iletisini okuyarak tetikleneceği dosyayı aklınızda bulunur.
  2. Tarayıcınızın geliştirici araçlarını açın ve sekmesine bakın. Gerekirse, istek ve yanıtların listesini görmek için sayfayı yeniden yükleyin. Bu listedeki hatayı tetikleyen dosyayı bulun.
  3. Yanıttaki HTTP durum kodunu denetleyin. Sunucu 200-Tamam (veya başka bir 2xx durum kodu) dışında bir şey döndürürse, tanılamaya yönelik bir sunucu tarafı sorununuz vardır. Örneğin, 403 durum kodu bir yetkilendirme sorunu olduğu anlamına gelirken durum kodu 500, sunucunun belirtilmeyen bir şekilde başarısız olduğu anlamına gelir. Uygulamayı tanılamak ve onarmak için sunucu tarafı günlüklerine başvurun.
  4. Durum kodu kaynak için 200-Tamam ise, tarayıcının geliştirici araçlarındaki yanıt içeriğine bakın ve içeriğin beklenen verilerle eşleşip eşleşmediğini denetleyin. Örneğin, yaygın bir sorun, isteklerin index.html diğer dosyalar için bile verilerinizi döndürmesi için yönlendirmeyi yanlış yapılandırmaktır. .wasmİsteklerin yanıtlarının, Weelsembly ikilileriyle ve .dll isteklerin yanıtlarının .NET Derleme ikili dosyalarına sahip olduğundan emin olun. Aksi takdirde, tanılamaya yönelik bir sunucu tarafı yönlendirme sorununuz vardır.
  5. Sorun giderme bütünlüğü PowerShell betiğiile uygulamanın yayımlanmış ve dağıtılan çıkışını doğrulamak için arama yapın.

Sunucunun sürekli doğru verileri döndürdüğünü onaylamak için, dosyanın oluşturulması ve teslimi arasındaki içerikleri değiştirmek için başka bir şey olması gerekir. Bunu araştırmak için:

  • Dosyalar derlendikten sonra dosyaları değiştirirken derleme araç zinciri ve dağıtım mekanizmasını inceleyin. Git 'in, daha önce açıklandığı gibi dosya satır sonlarını dönüştürerken buna bir örnektir.
  • yanıtları dinamik olarak değiştirmek üzere ayarlanmış olmaları durumunda (örneğin, HTML 'yi küçültmeye çalışırken) web sunucusunu veya CDN yapılandırmayı inceleyin. Web sunucusunun HTTP sıkıştırması uygulaması (örneğin, döndürme content-encoding: br veya döndürme content-encoding: gzip ), bu nedenle bu, sıkıştırmayı açma işleminden sonra sonucu etkilemez. Ancak, Web sunucusunun sıkıştırılmamış verileri değiştirmesi iyi değildir .

Bütünlük PowerShell betiği sorunlarını giderme

integrity.ps1Yayımlanmış ve dağıtılan bir uygulamayı doğrulamak için PowerShell betiğini kullanın Blazor . Komut dosyası, uygulamanın, Blazor Framework 'ün tanımlayamıyorum bir bütünlük sorunu olduğunda başlangıç noktası olarak PowerShell Core 6 için sağlanır. Betik özelleştirmesi, 6.2.7 sürümünden daha sonraki bir PowerShell sürümünde çalışıyor da dahil olmak üzere uygulamalarınız için gerekli olabilir.

Betik, klasördeki dosyaları denetler ve bütünlük karmaları içeren farklı bildirimlerde sorunları algılamak publish için dağıtılan uygulamadan indirilir. Bu denetimler en yaygın sorunları algılamalı:

  • Yayımlanan çıktıda bir dosyayı fark etmeden değiştirebilirsiniz.
  • Uygulama dağıtım hedefine doğru dağıtılamadı veya dağıtım hedefinin ortamında bir şey değişti.
  • Dağıtılan uygulama ile uygulamayı yayımlama çıkışı arasında farklar vardır.

PowerShell komut kabuğunda aşağıdaki komutla betiği çağırabilirsiniz:

.\integrity.ps1 {BASE URL} {PUBLISH OUTPUT FOLDER}

Yer tutucu:

  • {BASE URL}: Dağıtılan uygulamanın URL'si.
  • {PUBLISH OUTPUT FOLDER}: Uygulamanın klasörünün publish veya uygulamanın dağıtım için yayımladığı konumun yolu.

Not

Depoyu kopya dotnet/AspNetCore.Docs GitHub betik integrity.ps1 Bitdefender veya sistemde bulunan başka bir virüs tarayıcısı tarafından karantinaya alınmış olabilir. Genellikle, dosya bir virüs tarayıcısının, yalnızca kötü amaçlı yazılım varlığını işaret ediyor olabilir dosya desenlerini incelemektedir. Virüs tarayıcısının dosyayı quarantining'i önlemek için, repo klonlamadan önce virüs tarayıcısına bir özel durum ekleyin. Aşağıdaki örnek, bir Windows sistemi üzerinde betiğin tipik bir yoludur. Yolu diğer sistemler için gereken şekilde ayarlayın. Yer {USER} tutucu, kullanıcının yol kesimidir.

C:\Users\{USER}\Documents\GitHub\AspNetCore.Docs\aspnetcore\blazor\host-and-deploy\webassembly\_samples\integrity.ps1

Uyarı: Virüs tarayıcısı özel durumları oluşturmak tehlikelidir ve yalnızca dosyanın güvenli olduğu konusunda emin olunan durumlarda gerçekleştir yapılmalıdır.

Bir dosyanın sağlamalarının geçerli bir sağlama süresi değeriyle karşılaştırılması dosya güvenliğini garantilemez, ancak bir dosyayı sağlama sağlama değeri bulunduracak şekilde değiştirmek kötü amaçlı kullanıcılar için önemsiz değildir. Bu nedenle sağlamaları genel bir güvenlik yaklaşımı olarak yararlıdır. Yerel dosyanın sağlamalarını integrity.ps1 aşağıdaki değerlerden biri ile karşılaştırın:

  • SHA256: 6b0dc7aba5d8489136bb2969036432597615b11b4e432535e173ca077a0449c4
  • MD5: f0c800a4c72604bd47f3c19f5f0bb4f4

Aşağıdaki komutla dosyanın sağlama Windows işletim sistemi alın. Yer tutucu için yol ve dosya adını girin ve yer tutucu için üretecek sağlama sağlamalarının türünü (veya {PATH AND FILE NAME} {SHA512|MD5} ) SHA256 MD5 belirtir:

CertUtil -hashfile {PATH AND FILE NAME} {SHA256|MD5}

Sağlama tamı doğrulamanın ortamınız için yeterince güvenli olup olmadığını merak ediyorsanız, rehberlik için kuruluşun güvenlik liderliğine danışın.

Daha fazla bilgi için bkz. Kötü amaçlı yazılımları & tehditleri anlama.

Veri olmayan uygulamalar için bütünlük PWA devre dışı bırakma

Çoğu durumda bütünlük denetimi devre dışı bırakmayın. Bütünlük denetimi devre dışı bırakarak beklenmeyen yanıtlara neden olan ve daha önce listelenen avantajların kaybedildiği temel sorun çözülz.

Web sunucusunun tutarlı yanıtlar sağlamak için dayanamayaları olabilir ve bütünlük denetimlerini devre dışı bırakmaktan başka bir seçeneğiniz yoktur. Bütünlük denetimlerini devre dışı bırakmak için, projenin dosyasındaki bir Blazor WebAssembly özellik grubuna şunları .csproj ekleyin:

<BlazorCacheBootResources>false</BlazorCacheBootResources>

BlazorCacheBootResources ayrıca özelliği, SHA-256 karmalarının doğru olması için güvenilemediğini işaret etmelerinden dolayı , ve diğer dosyaları Blazor .dll SHA-256 karmalarına göre önbelleğe alma varsayılan davranışını devre dışı .wasm bırakmaktadır. Bu ayarla bile, tarayıcının normal HTTP önbelleği yine de bu dosyaları önbelleğe alır, ancak bunun olup olmadığı web sunucusu yapılandırmanıza ve hizmet ettiği üst cache-control bilgilere bağlıdır.

Not

özelliği BlazorCacheBootResources Aşamalı Web Uygulamaları (PWAs) için bütünlük denetimlerini devre dışı bırakmaz. PWA'lar hakkında rehberlik için PWAs için bütünlük denetlemeyi devre dışı bırakma bölümüne bakın.

PWA'lar için bütünlük denetlemesini devre dışı bırakma

Blazor'nin Aşamalı Web Uygulaması (PWA) şablonu, uygulama dosyalarını çevrimdışı kullanım için getirmek ve depolamakla sorumlu olan service-worker.published.js önerilen bir dosya içerir. Bu, normal uygulama başlatma mekanizmasından ayrı bir işlemdir ve kendi ayrı bütünlük denetimi mantığına sahiptir.

Dosyanın service-worker.published.js içinde aşağıdaki satır mevcuttur:

.map(asset => new Request(asset.url, { integrity: asset.hash }));

Bütünlük denetlemeyi devre dışı bırakmak integrity için, satırı aşağıdaki gibi değiştirerek parametresini kaldırın:

.map(asset => new Request(asset.url));

Yine bütünlük denetimi devre dışı bırakarak, bütünlük denetimi tarafından sunulan güvenlik garantilerini kaybedersiniz. Örneğin, kullanıcının tarayıcısı uygulamayı yeni bir sürüm dağıtan anda önbelleğe alma riskiyle karşı karşılasa, eski dağıtımdan bazı dosyaları ve bazıları yeni dağıtımdan önbelleğe alma riski vardır. Bu durumda, siz daha fazla güncelleştirme dağıtana kadar uygulama bozuk durumda takılıyor.

Barındırma Blazor WebAssembly modeli ile:

  • Uygulama, Blazor bağımlılıkları ve .NET çalışma zamanı tarayıcıya paralel olarak indirilir.
  • Uygulama doğrudan tarayıcı kullanıcı arabirimi iş parçacığında yürütülür.

Aşağıdaki dağıtım stratejileri de desteklenmeleridir:

  • Uygulama Blazor bir uygulama tarafından ASP.NET Core. Bu strateji, ASP.NET Core ile barındırılan dağıtım bölümünde ele almaktadır.
  • Uygulama, uygulamaya hizmet vermek için .NET'in kullanılmay olduğu statik bir barındırma Blazor web sunucusuna veya hizmetine Blazor yerleştirilir. Bu strateji, bir uygulamayı IIS alt uygulaması olarak barındırma hakkında bilgi içeren Tek başına dağıtım bölümünde Blazor WebAssembly ele almaktadır.

Önyükleme kaynaklarının nasıl yükleniyor olduğunu özelleştirme

API kullanarak önyükleme kaynaklarının nasıl yükleniyor olduğunu loadBootResource özelleştirin. Daha fazla bilgi için bkz. ASP.NET Core Blazor Başlangıç.

Sıkıştırma

Bir uygulama yayımlanırken, uygulamanın boyutunu azaltmak ve çalışma zamanı sıkıştırma yükünü kaldırmak için yayımlama sırasında Blazor WebAssembly çıkış statik olarak sıkıştırılır. Aşağıdaki sıkıştırma algoritmaları kullanılır:

Blazor , uygun sıkıştırılmış dosyaları hizmet etmek için ana bilgisayarı kullanır. Barındırılan bir ASP.NET Core kullanırken, konak projesi içerik anlaşması yapabilir ve statik olarak sıkıştırılmış dosyalara hizmet yapabilir. Tek başına Blazor WebAssembly bir uygulama barındırılırken, statik olarak sıkıştırılmış dosyaların hizmet olduğundan emin olmak için ek çalışma gerekebilir:

  • IIS sıkıştırma web.config yapılandırması için IIS: Brotli ve Gzip sıkıştırma bölümüne bakın.

  • GitHub Pages gibi statik olarak sıkıştırılmış dosya içeriği anlaşmasını desteklemeen statik barındırma çözümlerini barındırıyorsanız, uygulamayı Brotli sıkıştırılmış dosyalarını getirmek ve kodunu çözmek için yapılandırmayı göz önünde bulun:

    • google/brotli deposundan JavaScript Brotli kod çözücüs GitHub alın. Minimum kod çözücü dosyası olarak decode.min.js adlandırılmıştır ve deponun klasöründe js bulunur.

      Not

      Betiğin en küçük decode.js sürümü ( ) başarısız decode.min.js olursa, bunun yerine belirlenemeyen sürümü ( decode.js ) kullanmayı deneyin.

    • Kodu çözücü kullanmak için uygulamayı güncelleştirin.

      Dosyasında, wwwroot/index.html autostart false etiketinde olarak Blazor <script> ayarlayın:

      <script src="_framework/blazor.webassembly.js" autostart="false"></script>
      

      Blazoretiketinin <script> ardından ve kapanış </body> etiketinin önünde aşağıdaki JavaScript kod bloğuna <script> ekleyin:

      <script type="module">
        import { BrotliDecode } from './decode.min.js';
        Blazor.start({
          loadBootResource: function (type, name, defaultUri, integrity) {
            if (type !== 'dotnetjs' && location.hostname !== 'localhost') {
              return (async function () {
                const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
                if (!response.ok) {
                  throw new Error(response.statusText);
                }
                const originalResponseBuffer = await response.arrayBuffer();
                const originalResponseArray = new Int8Array(originalResponseBuffer);
                const decompressedResponseArray = BrotliDecode(originalResponseArray);
                const contentType = type === 
                  'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
                return new Response(decompressedResponseArray, 
                  { headers: { 'content-type': contentType } });
              })();
            }
          }
        });
      </script>
      

      Önyükleme kaynaklarını yükleme hakkında daha fazla bilgi için bkz. ASP.NET Core Blazor Başlangıç .

Sıkıştırmayı devre dışı bırakmak MSBuild uygulamanın proje dosyasına MSBuild BlazorEnableCompression özelliğini ekleyin ve değerini olarak false ayarlayın:

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

özelliği, BlazorEnableCompression komut kabuğunda dotnet publish aşağıdaki söz dizimi ile komuta geçirebilirsiniz:

dotnet publish -p:BlazorEnableCompression=false

Doğru yönlendirme için URL'leri yeniden yazma

Bir uygulamanın sayfa bileşenleri için Blazor WebAssembly yönlendirme istekleri, barındırılan bir uygulamasındaki yönlendirme istekleri kadar Blazor Server kolay değildir. İki bileşeni Blazor WebAssembly olan bir uygulamayı düşünün:

  • Main.razor: Uygulamanın köküne yüklenir ve bileşenin bağlantısını About içerir ( href="About" ).
  • About.razor: About bileşeni.

Uygulamanın varsayılan belgesi tarayıcının adres çubuğu kullanılarak istense (örneğin, https://www.contoso.com/ ):

  1. Tarayıcı bir istekte bulundu.
  2. Varsayılan sayfa döndürülür ve bu genellikle index.html olur.
  3. index.html uygulamayı önyükler.
  4. Blazor'nin yönlendiricisi yüklenir ve Razor Main bileşen işlenir.

Ana sayfada, bileşenin bağlantısını seçmek istemci üzerinde çalışır çünkü yönlendirici tarayıcının için İnternet'te bir istekte bulundurmasını durdurur ve işlenmiş bileşenin About Blazor kendisine hizmet www.contoso.com About About eder. Uygulama içindeki iç uç noktalara yapılan tüm istekler aynı şekilde çalışır: İstekler, İnternet'de sunucu tarafından barındırılan kaynaklara tarayıcı tabanlı istekleri tetiklemez. Blazor WebAssembly Yönlendirici istekleri dahili olarak ele almaktadır.

için tarayıcının adres çubuğu kullanılarak istek yapılırsa www.contoso.com/About istek başarısız olur. Uygulamanın İnternet ana bilgisayar üzerinde böyle bir kaynak yoktur, bu nedenle 404 - Bulunamadı yanıtı döndürülür.

Tarayıcılar istemci tarafı sayfalar için İnternet tabanlı konaklara istekte buluna olduğundan, web sunucuları ve barındırma hizmetleri sunucu üzerinde fiziksel olarak olmayan kaynaklar için tüm istekleri sayfaya yeniden index.html yazması gerekir. Döndürülen index.html uygulama yönlendiricisi, doğru Blazor kaynağı alır ve yanıt verir.

Iis sunucusuna dağıtım yapmak için URL Yeniden Yazma Modülünü uygulamanın yayımlanan dosyasıyla birlikte web.config kullanabilirsiniz. Daha fazla bilgi için IIS bölümüne bakın.

ASP.NET Core ile barındırılan dağıtım

Barındırılan dağıtım, web Blazor WebAssembly sunucusunda çalışan bir ASP.NET Core uygulamanın tarayıcılarına hizmet verir.

İstemci uygulaması, sunucu uygulamasının diğer statik web varlıklarıyla birlikte Blazor WebAssembly /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot sunucu uygulamasının klasöründe yayımlanır. İki uygulama birlikte dağıtılır. Uygulama barındırma özelliğine sahip bir web ASP.NET Core gerekir. Barındırılan bir dağıtım için Visual Studio (komutu kullanırken şablon) seçeneğinin seçili olduğu Uygulama proje şablonunu (komutunu kullanırken) Blazor WebAssembly blazorwasm dotnet new Hosted -ho|--hosted dotnet new içerir.

Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Birden çok uygulama ile barındırılan Blazor WebAssembly dağıtım

Uygulama yapılandırması

Barındırılan Blazor çözümler birden çok uygulama için Blazor WebAssembly kullanılabilir.

Not

Bu bölümdeki örnek, Visual Studio çözümünün kullanımına başvurur, ancak Visual Studio ve Visual Studio çözümünün birden çok istemci uygulamanın barındırılan uygulamalar senaryosunda çalışması için gerekli Blazor WebAssembly değildir. Visual Studio'i Visual Studio için oluşturulan diğer {SOLUTION NAME}.sln dosyaları yoksayın Visual Studio.

Aşağıdaki örnekte:

  • İlk (ilk) istemci uygulaması, proje şablonundan oluşturulan bir çözümün varsayılan istemci Blazor WebAssembly projesidir. İlk istemci uygulamasına, 5001 bağlantı noktası veya bir ana bilgisayarı ile URL'den /FirstApp bir tarayıcıdan firstapp.com erişilebilir.
  • Çözüme ikinci bir istemci uygulaması eklenir: SecondBlazorApp.Client . İkinci istemci uygulamasına, 5002 bağlantı noktası veya bir ana bilgisayarı ile URL'den /SecondApp bir tarayıcıdan secondapp.com erişilebilir.

Barındırılan mevcut bir Blazor çözümü kullanın veya Barındırılan proje şablonundan Blazor yeni bir çözüm oluşturun:

  • İstemci uygulamasının proje dosyasında, projesinin <StaticWebAssetBasePath> statik varlıkları için temel yolu ayarlamak için değerine sahip <PropertyGroup> bir özelliği FirstApp ekleyin:

    <PropertyGroup>
      ...
      <StaticWebAssetBasePath>FirstApp</StaticWebAssetBasePath>
    </PropertyGroup>
    
  • Çözüme ikinci bir istemci uygulaması ekleyin:

    • Çözümün SecondClient klasörüne adlı bir klasör ekleyin. Proje şablonundan oluşturulan çözüm klasörü, klasör eklendikten sonra aşağıdaki çözüm SecondClient dosyasını ve klasörleri içerir:

      • Client (klasör)
      • SecondClient (klasör)
      • Server (klasör)
      • Shared (klasör)
      • {SOLUTION NAME}.sln (dosya)

      Yer {SOLUTION NAME} tutucu, çözümün adıdır.

    • Proje Blazor WebAssembly şablonundan SecondBlazorApp.Client klasöründe adlı bir uygulama SecondClient Blazor WebAssembly oluşturun.

    • Uygulamanın SecondBlazorApp.Client proje dosyasında:

      • değerine <StaticWebAssetBasePath> bir <PropertyGroup> özelliği SecondApp ekleyin:

        <PropertyGroup>
          ...
          <StaticWebAssetBasePath>SecondApp</StaticWebAssetBasePath>
        </PropertyGroup>
        
      • Projeye bir proje başvurusu Shared ekleyin:

        <ItemGroup>
          <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
        </ItemGroup>
        

        Yer {SOLUTION NAME} tutucu, çözümün adıdır.

  • Sunucu uygulamasının proje dosyasında, eklenen istemci uygulaması için bir proje SecondBlazorApp.Client başvurusu oluşturun:

    <ItemGroup>
      <ProjectReference Include="..\Client\{SOLUTION NAME}.Client.csproj" />
      <ProjectReference Include="..\SecondClient\SecondBlazorApp.Client.csproj" />
      <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
    </ItemGroup>
    

    Yer {SOLUTION NAME} tutucu, çözümün adıdır.

  • Sunucu uygulamasının dosyasında, Properties/launchSettings.json applicationUrl Kestrel {SOLUTION NAME}.Server 5001 ve 5002 bağlantı noktalarında istemci uygulamalarına erişmek için profilin () dosyasını yapılandırabilirsiniz:

    "applicationUrl": "https://localhost:5001;https://localhost:5002",
    
  • Sunucu uygulamasının yönteminde ( ), çağrısının ardından Startup.Configure görünen aşağıdaki satırları Startup.cs UseHttpsRedirection kaldırın:

    -app.UseBlazorFrameworkFiles();
    -app.UseStaticFiles();
    
    -app.UseRouting();
    
    -app.UseEndpoints(endpoints =>
    -{
    -    endpoints.MapRazorPages();
    -    endpoints.MapControllers();
    -    endpoints.MapFallbackToFile("index.html");
    -});
    

    İstekleri istemci uygulamalarına eşleten ara yazılım ekleme. Aşağıdaki örnek, ara yazılımı şu zaman çalıştıracak şekilde yapılandırıyor:

    • İstek bağlantı noktası, özgün istemci uygulaması için 5001 veya eklenen istemci uygulaması için 5002'dir.

    • İstek ana bilgisayarı özgün firstapp.com istemci uygulamasına veya secondapp.com eklenen istemci uygulamasına yöneliktir.

      Not

      Bu bölümde gösterilen örnek için ek yapılandırma gerekir:

      • Örnek konak etki alanlarındaki uygulamalara erişme ve firstapp.com secondapp.com .
      • TLS güvenliğini (HTTPS) etkinleştirmek için istemci uygulamalarına sertifikalar.

      Gerekli yapılandırma bu makalenin kapsamının dışındadır ve çözümün nasıl barındırıldıklarını bağlıdır. Daha fazla bilgi için Barındırma ve dağıtma makalesine bakın.

    Satırların daha önce kaldırıldığı aşağıdaki kodu girin:

    app.MapWhen(ctx => ctx.Request.Host.Port == 5001 || 
        ctx.Request.Host.Equals("firstapp.com"), first =>
    {
        first.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/FirstApp" + ctx.Request.Path;
            return nxt();
        });
    
        first.UseBlazorFrameworkFiles("/FirstApp");
        first.UseStaticFiles();
        first.UseStaticFiles("/FirstApp");
        first.UseRouting();
    
        first.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/FirstApp/{*path:nonfile}", 
                "FirstApp/index.html");
        });
    });
    
    app.MapWhen(ctx => ctx.Request.Host.Port == 5002 || 
        ctx.Request.Host.Equals("secondapp.com"), second =>
    {
        second.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/SecondApp" + ctx.Request.Path;
            return nxt();
        });
    
        second.UseBlazorFrameworkFiles("/SecondApp");
        second.UseStaticFiles();
        second.UseStaticFiles("/SecondApp");
        second.UseRouting();
    
        second.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/SecondApp/{*path:nonfile}", 
                "SecondApp/index.html");
        });
    });
    

    hakkında daha fazla bilgi UseStaticFiles için ASP.NET Core Blazor statik dosyalar bkz. .

    ve hakkında daha fazla UseBlazorFrameworkFiles bilgi MapFallbackToFile için aşağıdaki kaynaklara bakın:

    Not

    Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal main ASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Core release/5.0 5.0 sürümü için dalı seçin.

  • Sunucu uygulamasının hava durumu tahmin denetleyicisinde ( Controllers/WeatherForecastController.cs ), var olan yolunu ( ) ile aşağıdaki [Route("[controller]")] WeatherForecastController yollarla değiştirin:

    [Route("FirstApp/[controller]")]
    [Route("SecondApp/[controller]")]
    

    Sunucu uygulamasının yöntemine daha önce eklenen ara yazılım, gelen istekleri veya bağlantı noktasına Startup.Configure /WeatherForecast /FirstApp/WeatherForecast /SecondApp/WeatherForecast (5001/5002) veya firstapp.com / secondapp.com etki alanına ( ) bağlı olarak ya da ile arasında değişiklik yaptı. Sunucu uygulamasından istemci uygulamalarına hava durumu verilerini geri dönmek için yukarıdaki denetleyici yolları gereklidir.

Birden çok uygulama için statik varlıklar ve sınıf Blazor WebAssembly kitaplıkları

Statik varlıklara başvuru yapmak için aşağıdaki yaklaşımları kullanın:

  • Varlık istemci uygulamasının klasöründe wwwroot olduğunda, yolu normal şekilde girin:

    <img alt="..." src="/{PATH AND FILE NAME}" />
    

    Yer {PATH AND FILE NAME} tutucu, altındaki yol ve dosya adıdır. wwwroot

  • Varlık bir Sınıf Kitaplığı wwwroot Razor 'nın (RCL)klasöründe olduğunda, 'daki kılavuza göre istemci uygulamasındaki statik varağa Kullanıcı arabirimi ile Razor sınıf kitaplıklarında yeniden ASP.NET Core bakın:

    <img alt="..." src="_content/{PACKAGE ID}/{PATH AND FILE NAME}" />
    

    Yer {PACKAGE ID} tutucu, kitaplığın paket kimliğidir. Proje dosyasında belirtilmezse paket kimliği <PackageId> varsayılan olarak projenin derleme adını kullanır. Yer {PATH AND FILE NAME} tutucu, altındaki yol ve dosya adıdır. wwwroot

RCL'ler hakkında daha fazla bilgi için bkz:

Tek başına dağıtım

Tek başına dağıtım, Blazor WebAssembly uygulamaya doğrudan istemciler tarafından istenen statik dosyalar kümesi olarak hizmet sağlar. Herhangi bir statik dosya sunucusu uygulamaya hizmet Blazor verir.

Tek başına dağıtım varlıkları klasöründe /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot yayımlanır.

Azure App Service

Blazor WebAssemblyuygulamaları, uygulamayı IIS üzerinde barındıran Windows Azure Uygulama Hizmetleri'ne dağıtılabilir.

Linux için tek Blazor WebAssembly başına Azure App Service dağıtım şu anda desteklenmiyor. Uygulamayı barındırmak için linux sunucusu görüntüsü şu anda kullanılamıyor. Bu senaryoyu etkinleştirmek için çalışmalar devam ediyor.

Azure statik web uygulaması

Daha fazla bilgi için bkz. Öğretici: ile statik bir web Blazor uygulaması Azure Static Web Apps.

IIS

IIS, uygulamalar için uyumlu bir statik dosya Blazor sunucusudur. IIS'yi barındırmak üzere Blazor yapılandırmak için bkz. IIS'de Statik Web Sitesi Oluşturma.

Yayımlanan varlıklar klasöründe /bin/Release/{TARGET FRAMEWORK}/publish oluşturulur. Klasörün içeriğini publish web sunucusunda veya barındırma hizmette barındırabilirsiniz.

web.config

Bir Blazor proje yayım olduğunda, web.config aşağıdaki IIS yapılandırmasıyla bir dosya oluşturulur:

  • MIME türleri
  • Aşağıdaki MIME türleri için HTTP sıkıştırma etkinleştirildi:
    • application/octet-stream
    • application/wasm
  • URL Yeniden Yazma Modülü kuralları kurulur:
    • Uygulamanın statik varlıklarının bulunduğu alt dizine hizmet edin ( wwwroot/{PATH REQUESTED} ).
    • Dosya olmayan varlıklara yapılan isteklerin statik varlıklar klasöründeki ( ) uygulamanın varsayılan belgesine yönlendirilmesi için SPA geri dönüş yönlendirmesi wwwroot/index.html oluşturun.

Özel bir uygulama web.config

Özel bir dosya web.config kullanmak için özel dosyayı proje web.config klasörünün köküne yazın. Uygulamayı, uygulamanın proje dosyasında kullanarak PublishIISAssets IIS'ye özgü varlıkları yayımlayacak şekilde yapılandırma ve projeyi yayımlama:

<PropertyGroup>
  <PublishIISAssets>true</PublishIISAssets>
</PropertyGroup>

URL Yeniden Yazma Modülünü Yükleme

URL Yeniden Yazma Modülü URL'leri yeniden yazmak için gereklidir. Modül varsayılan olarak yüklenmez ve Web Sunucusu (IIS) rol hizmeti özelliği olarak yüklenmek üzere kullanılamaz. Modülün IIS web sitesinden indirilmiş olması gerekir. Modülü yüklemek için Web Platformu Yükleyicisi'ne tıklayın:

  1. Yerel olarak, URL Yeniden Yazma Modülü indirme sayfasına gidin. İngilizce sürüm için WebPI yükleyicisini indirmek için WebPI'yi seçin. Diğer diller için, yükleyiciyi indirmek için sunucu için uygun mimariyi (x86/x64) seçin.
  2. Yükleyiciyi sunucuya kopyalayın. Yükleyiciyi çalıştırın. Yükle düğmesini seçin ve lisans koşullarını kabul et. Yükleme tamamlandıktan sonra sunucunun yeniden başlatılması gerekmez.

Web sitesini yapılandırma

Web sitesinin Fiziksel yolunu uygulamanın klasörüne ayarlayın. Klasör şunları içerir:

  • web.configIIS'nin gerekli yeniden yönlendirme kuralları ve dosya içeriği türleri dahil olmak üzere web sitesini yapılandırmak için kullandığı dosya.
  • Uygulamanın statik varlık klasörü.

IIS alt uygulaması olarak barındırma

Tek başına bir uygulama IIS alt uygulaması olarak barındırıldısa, aşağıdakilerden birini gerçekleştirin:

  • Devralınan Modül ASP.NET Core devre dışı bırakma.

    Uygulamanın yayımlanan Blazor dosyasındaki web.config işleyiciyi kaldırmak için <handlers> dosyanın bölümüne bir bölüm <system.webServer> ekleyin:

    <handlers>
      <remove name="aspNetCore" />
    </handlers>
    
  • olarak ayarlanmış bir öğe kullanarak kök (üst) <system.webServer> uygulamanın bölümünün <location> devralmasını inheritInChildApplications devre dışı false bırakma:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <handlers>
            <add name="aspNetCore" ... />
          </handlers>
          <aspNetCore ... />
        </system.webServer>
      </location>
    </configuration>
    

    Not

    Kök (üst) uygulamanın bölümünün devralmasını devre dışı bırakmak, .NET SDK'sı kullanılarak yayımlanan <system.webServer> uygulamalar için varsayılan yapılandırmadır.

İşleyiciyi kaldırma veya devralmayı devre dışı bırakma, uygulamanın temel yolunu yapılandırmaya ek olarak gerçekleştirilir. Uygulamanın dosyasındaki uygulama temel yolunu, IIS'de alt uygulamayı yapılandırırken kullanılan index.html IIS diğer adıyla ayarlayın.

Brotli ve Gzip sıkıştırması

Bu bölüm yalnızca tek başına uygulamalar için geçerlidir. Barındırılan uygulamalar, bu ASP.NET Core bağlı dosya değil, varsayılan Blazor WebAssembly Blazor bir uygulama dosyası web.config kullanır.

IIS, tek başına uygulamalar için web.config Brotli veya Gzip sıkıştırılmış varlıklarına Blazor hizmet vermek üzere aracılığıyla Blazor WebAssembly yalıtılabilir. Örnek bir yapılandırma dosyası için web.config bkz. .

Aşağıdaki senaryolarda web.config örnek dosyanın ek yapılandırması gerekebilir:

  • Uygulamanın belirtimi, aşağıdakilerden birini çağrılır:
    • Örnek dosya tarafından yapılandırılmamış sıkıştırılmış dosyaları web.config sunan.
    • Örnek dosya tarafından yapılandırılan sıkıştırılmış web.config dosyaları sıkıştırılmamış biçimde sunan.
  • Sunucunun IIS yapılandırması (örneğin, applicationHost.config ) sunucu düzeyinde IIS varsayılanları sağlar. Sunucu düzeyinde yapılandırmaya bağlı olarak, uygulama örnek dosyanın içerdiğinden farklı bir IIS web.config yapılandırmasına ihtiyaç kullanabilir.

Sorun giderme

500 - İç Sunucu Hatası alırsanız ve IIS Yöneticisi web sitesinin yapılandırmasına erişmeye çalışırken hatalar atarsa, URL Yeniden Yazma Modülünün yüklü olduğunu onaylayın. Modül yüklü değilse, dosya web.config IIS tarafından ayrıştırılamaz. Bu, IIS Yöneticisi'nin web sitesinin yapılandırmasını yüklemesini ve web sitesinin statik Blazor dosyalarına hizmet yapılandırmasını yüklemesini önler.

IIS'ye yapılan dağıtımlarda sorun giderme hakkında daha fazla bilgi için bkz. Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme .

Azure Storage

Azure Depolama statik dosya barındırma sunucusuz uygulama Blazor barındırmaya olanak sağlar. Özel etki alanı adları, Azure Content Delivery Network (CDN) ve HTTPS de kullanılabilir.

Depolama hesabında statik web sitesi barındırmak için blob hizmeti etkinleştirildiğinde:

  • Dizin belgesi adını olarak index.html ayarlayın.
  • Hata belgesi yolunu olarak index.html ayarlayın. Razor bileşenleri ve dosya olmayan diğer uç noktalar, blob hizmeti tarafından depolanan statik içerikte fiziksel yollarda yer alamdır. Bu kaynaklardan biri için yönlendiricinin işlemesi gereken bir istek geldiğinde, blob hizmeti tarafından oluşturulan Blazor 404 - Bulunamadı hatası isteği Hata belge yoluna yönlendirmektedir. index.htmlBlob döndürülür ve yönlendirici yolu yükler ve Blazor işler.

Dosyaların üst bilgilerinde uygun olmayan MIME türleri nedeniyle dosyalar çalışma zamanında yüklenmezse Content-Type aşağıdaki eylemlerden birini gerçekleştirin:

  • Dosyalar dağıtıldığında doğru MIME türlerini ( Content-Type üst bilgileri) ayarlamak için araçlarınızı yapılandırma.

  • Uygulama dağıtıldıktan sonra dosyalar için MIME türlerini ( Content-Type üst bilgileri) değiştirme.

    Her Depolama Gezgini (Azure portal) içinde:

    1. Dosyaya sağ tıklayın ve Özellikler’i seçin.
    2. ContentType'ı ayarlayın ve Kaydet düğmesini seçin.

Daha fazla bilgi için bkz. Azure'da statik web sitesi Depolama.

Nginx

Aşağıdaki nginx.conf dosya, diskte karşılık gelen bir dosyayı bulamadı mı Nginx'i dosya gönderecek şekilde index.html yapılandırmayı gösterecek şekilde basitleştirilmiştir.

events { }
http {
    server {
        listen 80;

        location / {
            root      /usr/share/nginx/html;
            try_files $uri $uri/ /index.html =404;
        }
    }
}

ile NGINX seri hız sınırını ayarlarken, uygulamalar bir uygulama tarafından yapılan nispeten çok sayıda isteği karşılamak için büyük limit_req bir parametre değeri Blazor WebAssembly burst gerektirir. Başlangıçta değeri en az 60 olarak ayarlayın:

http {
    server {
        ...

        location / {
            ...

            limit_req zone=one burst=60 nodelay;
        }
    }
}

Tarayıcı geliştirici araçları veya ağ trafiği aracı isteklerin 503 - Hizmet Kullanılamıyor durum kodunu aldığını gösteriyorsa değeri artırın.

Üretim Nginx web sunucusu yapılandırması hakkında daha fazla bilgi için bkz. NGINX Plus ve NGINX Yapılandırma Dosyaları Oluşturma.

Apache

Blazor WebAssemblyCentOS 7 veya sonraki bir cihaza uygulama dağıtmak için:

  1. Apache yapılandırma dosyasını oluşturun. Aşağıdaki örnek, basitleştirilmiş bir yapılandırma dosyasıdır ( blazorapp.config ):

    <VirtualHost *:80>
        ServerName www.example.com
        ServerAlias *.example.com
    
        DocumentRoot "/var/www/blazorapp"
        ErrorDocument 404 /index.html
    
        AddType application/wasm .wasm
        AddType application/octet-stream .dll
    
        <Directory "/var/www/blazorapp">
            Options -Indexes
            AllowOverride None
        </Directory>
    
        <IfModule mod_deflate.c>
            AddOutputFilterByType DEFLATE text/css
            AddOutputFilterByType DEFLATE application/javascript
            AddOutputFilterByType DEFLATE text/html
            AddOutputFilterByType DEFLATE application/octet-stream
            AddOutputFilterByType DEFLATE application/wasm
            <IfModule mod_setenvif.c>
          BrowserMatch ^Mozilla/4 gzip-only-text/html
          BrowserMatch ^Mozilla/4.0[678] no-gzip
          BrowserMatch bMSIE !no-gzip !gzip-only-text/html
      </IfModule>
        </IfModule>
    
        ErrorLog /var/log/httpd/blazorapp-error.log
        CustomLog /var/log/httpd/blazorapp-access.log common
    </VirtualHost>
    
  2. Apache yapılandırma dosyasını /etc/httpd/conf.d/ CentOS 7'de varsayılan Apache yapılandırma dizini olan dizine alın.

  3. Uygulamanın dosyalarını dizinine /var/www/blazorapp (yapılandırma dosyasında belirtilen DocumentRoot konum) yer alır.

  4. Apache hizmetini yeniden başlatın.

Daha fazla bilgi için bkz. mod_mime ve mod_deflate .

GitHub Pages

URL yeniden yazmalarını işlemek için, isteği wwwroot/404.html sayfaya yönlendiren bir betik ile bir dosya index.html ekleyin. Bir örnek için, steveSclientsonMS/ Blazor OnGitHubPages GitHub bakın:

Bir kuruluş sitesi yerine proje sitesi kullanırken, içinde <base> etiketini wwwroot/index.html güncelleştirin. Öznitelik href değerini, sonda eğik GitHub depo adına ayarlayın (örneğin, /my-repository/ ). SteveSpagesonMS/ Blazor OnGitHubPages GitHubdeposunda, temel yapılandırma dosyası tarafından href yayımlanarak .github/workflows/main.yml güncelleştirilir.

Not

SteveSclientsonMS/ Blazor OnGitHubPages GitHub deposu .NET Foundation veya Microsoft tarafından sahip olunamaz, bakıma alınamaz veya desteklenmiyor.

Konak yapılandırma değerleri

Blazor WebAssembly uygulamaları, geliştirme ortamında çalışma zamanında komut satırı bağımsız değişkenleri olarak aşağıdaki konak yapılandırma değerlerini kabul eder.

İçerik kökü

bağımsız --contentroot değişkeni, uygulamanın içerik dosyalarını (içerik kökü) içeren dizinin mutlakyolunu ayarlar. Aşağıdaki örneklerde /content-root-path uygulamanın içerik kök yolu verilmiştir.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --contentroot=/content-root-path
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir giriş ekleyin. Bu ayar, uygulama Visual Studio Debugger ile ve ile bir komut isteminden çalıştır çalıştır olduğunda dotnet run kullanılır.

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • Bu Visual Studio, Properties Debug Application bağımsız > değişkenlerini > içinde bağımsız değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişkenin ayarı, dosyaya bağımsız değişkeni launchSettings.json ekler.

    --contentroot=/content-root-path
    

Yol tabanı

bağımsız değişkeni, kök olmayan göreli URL yolu ile yerel olarak çalıştırilen bir uygulamanın uygulama temel yolunu ayarlar (etiket hazırlama ve üretim dışında --pathbase <base> bir yola href / ayarlanır). Aşağıdaki örneklerde /relative-URL-path uygulamanın yol tabanı verilmiştir. Daha fazla bilgi için bkz. Uygulama temel yolu.

Önemli

etiketinin yolu ile sağlanan yoldan farklı olarak, bağımsız değişken değerini iletirken sonda eğik href çizgi ( ) dahil <base> / --pathbase etme. Uygulama temel yolu etikette olarak sağlanıyorsa (sonda bir eğik çizgi içerir), komut satırı bağımsız değişken değerini <base> <base href="/CoolApp/"> olarak --pathbase=/CoolApp (sonda eğik çizgi yok) olarak geçişin.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --pathbase=/relative-URL-path
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir giriş ekleyin. Bu ayar, uygulamayı Visual Studio Debugger ile ve ile bir komut isteminden çalıştırarak dotnet run kullanılır.

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • Bu Visual Studio, Properties Debug Application bağımsız > değişkenlerini > içinde bağımsız değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişkenin ayarı, dosyaya bağımsız değişkeni launchSettings.json ekler.

    --pathbase=/relative-URL-path
    

URL’ler

bağımsız --urls değişkeni, ip adreslerini veya ana bilgisayar adreslerini istekleri dinleyecek bağlantı noktaları ve protokollerle ayarlar.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --urls=http://127.0.0.1:0
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir giriş ekleyin. Bu ayar, uygulamayı Visual Studio Debugger ile ve ile bir komut isteminden çalıştırarak dotnet run kullanılır.

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • Bu Visual Studio, Properties Debug Application bağımsız > değişkenlerini > içinde bağımsız değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişkenin ayarı, dosyaya bağımsız değişkeni launchSettings.json ekler.

    --urls=http://127.0.0.1:0
    

Kesiciyi yapılandırma

Blazor , çıkış derlemelerinden gereksiz IL'i kaldırmak için her Yayın derlemesi üzerinde Ara Dil (IL) kırpma gerçekleştirir. Daha fazla bilgi için bkz. Trimmer'i ASP.NET Core Blazor.

DLL dosyalarının dosya adı uzantısını değiştirme

Uygulamanın yayımlanan dosyalarının dosya adı uzantılarını değiştirmek zorundaysanız .dll bu bölümdeki yönergeleri izleyin.

Uygulamayı yayımlandıktan sonra, dosyaları farklı bir dosya uzantısı DevOps yeniden adlandırmak için bir kabuk betiği veya derleme .dll işlem hattı kullanın. Uygulamanın .dll yayımlanan wwwroot çıkışının dizininde yer alan dosyaları hedefle (örneğin, {CONTENT ROOT}/bin/Release/netstandard2.1/publish/wwwroot ).

Aşağıdaki örneklerde, .dll dosyalar dosya uzantısını kullanmak üzere yeniden .bin adlandırıldı.

Windows'da:

dir .\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content .\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content .\_framework\blazor.boot.json

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

((Get-Content .\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content .\service-worker-assets.js

Linux veya macOS 'ta:

for f in _framework/_bin/*; do mv "$f" "`echo $f | sed -e 's/\.dll/.bin/g'`"; done
sed -i 's/\.dll"/.bin"/g' _framework/blazor.boot.json

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

sed -i 's/\.dll"/.bin"/g' service-worker-assets.js

Farklı bir dosya uzantısını kullanmak için .bin .bin Yukarıdaki komutlarda değiştirin.

Sıkıştırılmış blazor.boot.json.gz ve dosyaları çözmek için blazor.boot.json.br aşağıdaki yaklaşımlardan birini benimseyin:

  • Sıkıştırılmış blazor.boot.json.gz ve dosyaları kaldırın blazor.boot.json.br . Sıkıştırma bu yaklaşım ile devre dışı bırakıldı.
  • Güncelleştirilmiş dosyayı yeniden sıkıştırın blazor.boot.json .

Yukarıdaki kılavuz, hizmet çalışanı varlıkları kullanımda olduğunda da geçerlidir. Ve ' i kaldırın veya yeniden sıkıştırın wwwroot/service-worker-assets.js.br wwwroot/service-worker-assets.js.gz . Aksi halde, tarayıcıda dosya bütünlüğü denetimleri başarısız olur.

aşağıdaki Windows örnek, projenin köküne yerleştirilmiş bir PowerShell betiğini kullanır.

ChangeDLLExtensions.ps1::

param([string]$filepath,[string]$tfm)
dir $filepath\bin\Release\$tfm\wwwroot\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json.gz

Hizmet çalışanı varlıkları da kullanılıyorsa, aşağıdaki komutu ekleyin:

((Get-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js

Proje dosyasında, komut dosyası uygulama yayımlandıktan sonra çalıştırılır:

<Target Name="ChangeDLLFileExtensions" AfterTargets="Publish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; { .\ChangeDLLExtensions.ps1 '$(SolutionDir)' '$(TargetFramework)'}&quot;" />
</Target>

Not

Aynı derlemeleri yeniden adlandırırken ve geç yüklerken, içindeki kılavuza bakın Derlemelerde yavaş yükleme derlemeleri ASP.NET Core Blazor WebAssembly .

Bütünlük denetimi başarısızlıklarını çözümleyin

Blazor WebAssemblyUygulamanın başlangıç dosyalarını indirdiğinde, tarayıcıya yanıtlar üzerinde bütünlük denetimleri gerçekleştirmesini söyler. blazor.boot.json .dll , Ve diğer dosyalar IÇIN beklenen SHA-256 karma değerlerini belirtmek için dosyadaki bilgileri kullanır .wasm . Bu, aşağıdaki nedenlerle faydalıdır:

  • Örneğin, Kullanıcı uygulama dosyalarını indirme sürecinde olduğunda, Web sunucunuza yeni bir dağıtım uygulanmışsa, tutarsız bir dosya kümesini yükleme riskini almanızı sağlar. Tutarsız dosyalar tanımsız davranışa yol açabilir.
  • Kullanıcının tarayıcısının hiçbir şekilde tutarsız veya geçersiz yanıtları önbelleklemesini sağlar, bu da sayfayı el ile yenilese bile uygulamayı başlatmalarını engelleyebilir.
  • Yanıtları önbelleğe alma işlemini güvenli hale getirir ve beklenen SHA-256 karmaları değişene kadar sunucu tarafı değişikliklerini kontrol etmez, sonraki sayfa yüklemeleri daha az istek içerir ve çok daha hızlı tamamlanır.

Web sunucunuz beklenen SHA-256 karmalarıyla eşleşmeyen yanıtlar döndürürse, tarayıcının geliştirici konsolunda aşağıdakine benzer bir hata görürsünüz:

https://myapp.example.com/\_framework/My Blazor Hesaplanan SHA-256 bütünlüğü ' IIa70iwvmEg5WiDV17OpQ5eCztNYqL186J56852RpJY = ' ile 'App.dll ' kaynağı için ' Integrity ' özniteliğinde geçerli bir Özet bulunamadı. Kaynak engellendi.

Çoğu durumda bu, bütünlük denetimi ile ilgili bir sorun değildir . Bunun yerine, başka bir sorun olduğu anlamına gelir ve bu sorunu gidermek için bütünlük denetimi size uyarı verebilir.

Bütünlük sorunlarını tanılama

Bir uygulama oluşturulduğunda, oluşturulan blazor.boot.json bildirim, derleme çıktısının oluşturulduğu sırada önyükleme KAYNAKLARıNıZıN SHA-256 karmalarını (örneğin,, .dll .wasm ve diğer dosyaları) açıklar. ' Deki SHA-256 karmaları blazor.boot.json tarayıcıya teslim edilen dosyalarla eşleştiği sürece bütünlük denetimi geçirilir.

Bunun başarısız olmasının yaygın nedenleri:

  • Web sunucusunun yanıtı, tarayıcı istenen dosya yerine bir hatadır (örneğin, bir 404-bulunamadı veya 500-Internal Server Error). Bu, tarayıcı tarafından bir bütünlük denetimi hatası olarak bildirilir ve yanıt hatası olarak değildir.
  • Dosya içeriğini tarayıcıya, dosyaların oluşturulması ve teslimi arasında değiştiren bir sorun. Bu durum oluşabilir:
    • Ya da yapı araçları derleme çıkışını el ile değiştirir.
    • Dağıtım işleminin bazı bir yönü dosyaları değiştirdiyseniz. örneğin, git tabanlı bir dağıtım mekanizması kullanıyorsanız, git 'in Windows üzerinde dosya oluşturup Linux 'ta kullanıma hazır olması durumunda git 'in Windows stili satır sonlarını şeffaf olarak unıx stili satır sonlarına dönüştürdüğünü göz önünde bulundurun. Dosya satır sonlarını değiştirmek için SHA-256 karmaları değiştirin. Bu sorundan kaçınmak için, .gitattributes Yapı yapıtlarını binary dosya olarak değerlendirmek üzerekullanmayı düşünün.
    • Web sunucusu, bu dosyaları sunma bölümünde dosya içeriğini değiştirir. Örneğin, bazı içerik dağıtım ağları (CDNs) otomatik olarak HTML 'yi küçültmeye çalışır ve bu sayede onu değiştirir. Bu tür özellikleri devre dışı bırakmanız gerekebilir.

Bu durumun hangi durumlarda geçerli olduğunu tanılamak için:

  1. Hatanın hata iletisini okuyarak tetikleneceği dosyayı aklınızda bulunur.
  2. Tarayıcınızın geliştirici araçlarını açın ve sekmesine bakın. Gerekirse, istek ve yanıtların listesini görmek için sayfayı yeniden yükleyin. Bu listedeki hatayı tetikleyen dosyayı bulun.
  3. Yanıttaki HTTP durum kodunu denetleyin. Sunucu 200-Tamam (veya başka bir 2xx durum kodu) dışında bir şey döndürürse, tanılamaya yönelik bir sunucu tarafı sorununuz vardır. Örneğin, 403 durum kodu bir yetkilendirme sorunu olduğu anlamına gelirken durum kodu 500, sunucunun belirtilmeyen bir şekilde başarısız olduğu anlamına gelir. Uygulamayı tanılamak ve onarmak için sunucu tarafı günlüklerine başvurun.
  4. Durum kodu kaynak için 200-Tamam ise, tarayıcının geliştirici araçlarındaki yanıt içeriğine bakın ve içeriğin beklenen verilerle eşleşip eşleşmediğini denetleyin. Örneğin, yaygın bir sorun, isteklerin index.html diğer dosyalar için bile verilerinizi döndürmesi için yönlendirmeyi yanlış yapılandırmaktır. .wasmİsteklerin yanıtlarının, Weelsembly ikilileriyle ve .dll isteklerin yanıtlarının .NET Derleme ikili dosyalarına sahip olduğundan emin olun. Aksi takdirde, tanılamaya yönelik bir sunucu tarafı yönlendirme sorununuz vardır.
  5. Sorun giderme bütünlüğü PowerShell betiğiile uygulamanın yayımlanmış ve dağıtılan çıkışını doğrulamak için arama yapın.

Sunucunun sürekli doğru verileri döndürdüğünü onaylamak için, dosyanın oluşturulması ve teslimi arasındaki içerikleri değiştirmek için başka bir şey olması gerekir. Bunu araştırmak için:

  • Dosyalar derlendikten sonra dosyaları değiştirirken derleme araç zinciri ve dağıtım mekanizmasını inceleyin. Git 'in, daha önce açıklandığı gibi dosya satır sonlarını dönüştürerken buna bir örnektir.
  • yanıtları dinamik olarak değiştirmek üzere ayarlanmış olmaları durumunda (örneğin, HTML 'yi küçültmeye çalışırken) web sunucusunu veya CDN yapılandırmayı inceleyin. Web sunucusunun HTTP sıkıştırması uygulaması (örneğin, döndürme content-encoding: br veya döndürme content-encoding: gzip ), bu nedenle bu, sıkıştırmayı açma işleminden sonra sonucu etkilemez. Ancak, Web sunucusunun sıkıştırılmamış verileri değiştirmesi iyi değildir .

Bütünlük PowerShell betiği sorunlarını giderme

integrity.ps1Yayımlanmış ve dağıtılan bir uygulamayı doğrulamak için PowerShell betiğini kullanın Blazor . Komut dosyası, uygulamanın, Blazor Framework 'ün tanımlayamıyorum bir bütünlük sorunu olduğunda başlangıç noktası olarak PowerShell Core 6 için sağlanır. Betik özelleştirmesi, 6.2.7 sürümünden daha sonraki bir PowerShell sürümünde çalışıyor da dahil olmak üzere uygulamalarınız için gerekli olabilir.

Betik, klasördeki dosyaları denetler publish ve bütünlük karmalarını içeren farklı bildirimlerde sorunları algılamak için dağıtılan uygulamadan indirilir. Bu denetimler en yaygın sorunları algılamamalıdır:

  • Yayımlanan çıktıda bir dosyayı gerçekleştirmeden değiştirdiniz.
  • Uygulama, dağıtım hedefine doğru şekilde dağıtılmadı veya dağıtım hedefinin ortamında bir değişiklik yapılamayabilir.
  • Dağıtılan uygulamayla çıkış arasında uygulamanın yayımlaması arasında farklılıklar vardır.

PowerShell komut kabuğu 'nda aşağıdaki komutla betiği çağırın:

.\integrity.ps1 {BASE URL} {PUBLISH OUTPUT FOLDER}

İçeremez

  • {BASE URL}: Dağıtılan uygulamanın URL 'SI.
  • {PUBLISH OUTPUT FOLDER}: Uygulamanın publish dağıtım için yayımlandığı klasörün veya konumun yolu.

Not

dotnet/AspNetCore.DocsGitHub deposu kopyalanırken, integrity.ps1 komut dosyası bitdefender veya sistemde bulunan başka bir virüs tarayıcısı tarafından karantinaya alınmış olabilir. Genellikle, dosya yalnızca kötü amaçlı yazılımın varlığını gösterebilen dosyalardaki desenleri gösteren bir virüs tarayıcısı buluşsal tarama teknolojisi tarafından yakalanarak kaydedilir. Virüs tarayıcısının dosyayı karantinaya almasını engellemek için depoyu kopyalamadan önce virüs tarayıcıya bir özel durum ekleyin. aşağıdaki örnek, bir Windows sisteminde betiğinin tipik bir yoludur. Yolu, diğer sistemler için gereken şekilde ayarlayın. Yer tutucu, {USER} kullanıcının yol segmentinde yer tutucudur.

C:\Users\{USER}\Documents\GitHub\AspNetCore.Docs\aspnetcore\blazor\host-and-deploy\webassembly\_samples\integrity.ps1

Uyarı: virüs tarayıcısı özel durumlarının oluşturulması tehlikelidir ve yalnızca dosyanın güvenli olduğundan emin olduğunuzda gerçekleştirilmelidir.

Bir dosyanın sağlama toplamını geçerli bir sağlama toplamı değeriyle karşılaştırmak dosya güvenliğini garanti etmez, ancak bir dosyayı bir sağlama toplamı değerini tutan şekilde değiştirmek kötü amaçlı kullanıcılar için önemsiz değildir. Bu nedenle, sağlama toplamı genel bir güvenlik yaklaşımı olarak faydalıdır. Yerel dosyanın sağlama toplamını integrity.ps1 aşağıdaki değerlerden biriyle karşılaştırın:

  • SHA256 6b0dc7aba5d8489136bb2969036432597615b11b4e432535e173ca077a0449c4
  • MD5 f0c800a4c72604bd47f3c19f5f0bb4f4

aşağıdaki komutla Windows işletim sisteminde dosyanın sağlama toplamını alın. Yer tutucu için yol ve dosya adı belirtin {PATH AND FILE NAME} ve yer tutucu için üretilecek sağlama toplamı türünü belirtin, ya {SHA512|MD5} da SHA256 MD5 :

CertUtil -hashfile {PATH AND FILE NAME} {SHA256|MD5}

Sağlama toplamı doğrulamasının ortamınızda yeterince güvenli olmadığından emin olmak için herhangi bir neden varsa, rehberlik için kuruluşunuzun güvenlik liderliğine başvurun.

Daha fazla bilgi için bkz. diğer tehditler & kötü amaçlı yazılımları anlama.

PWA olmayan uygulamalar için bütünlük denetimini devre dışı bırak

Çoğu durumda, bütünlük denetimini devre dışı bırakın. Bütünlük denetimini devre dışı bırakmak, beklenmeyen yanıtlara neden olan temeldeki sorunu çözmez ve daha önce listelenen avantajları kaybetme sonucunu vermez.

Web sunucusunun tutarlı yanıtlar döndürecek şekilde güvenmeme, ancak hiçbir seçim olmadığı ancak bütünlük denetimlerini devre dışı bırakabileceği durumlar olabilir. Bütünlük denetimlerini devre dışı bırakmak için aşağıdakini proje dosyasındaki bir özellik grubuna ekleyin Blazor WebAssembly .csproj :

<BlazorCacheBootResources>false</BlazorCacheBootResources>

BlazorCacheBootResourcesBlazor .dll , .wasm özelliği SHA-256 karmalarını temel alarak,, ve diğer dosyaları önbelleğe almanın varsayılan davranışını devre dışı bırakır çünkü özellik SHA-256 karmalarını doğruluk açısından güvenemediğini belirtir. Bu ayarla bile, tarayıcının normal HTTP önbelleği yine de bu dosyaları önbelleğe alır, ancak bunun olup olmadığı web sunucusu yapılandırmanıza ve hizmet ettiği üst cache-control bilgilere bağlıdır.

Not

özelliği BlazorCacheBootResources Aşamalı Web Uygulamaları (PWAs) için bütünlük denetimlerini devre dışı bırakmaz. PWA'lar hakkında rehberlik için PWAs için bütünlük denetlemeyi devre dışı bırakma bölümüne bakın.

PWA'lar için bütünlük denetlemesini devre dışı bırakma

Blazor'nin Aşamalı Web Uygulaması (PWA) şablonu, uygulama dosyalarını çevrimdışı kullanım için getirmek ve depolamakla sorumlu olan service-worker.published.js önerilen bir dosya içerir. Bu, normal uygulama başlatma mekanizmasından ayrı bir işlemdir ve kendi ayrı bütünlük denetimi mantığına sahiptir.

Dosyanın service-worker.published.js içinde aşağıdaki satır mevcuttur:

.map(asset => new Request(asset.url, { integrity: asset.hash }));

Bütünlük denetlemeyi devre dışı bırakmak integrity için, satırı aşağıdaki gibi değiştirerek parametresini kaldırın:

.map(asset => new Request(asset.url));

Yine bütünlük denetimi devre dışı bırakarak, bütünlük denetimi tarafından sunulan güvenlik garantilerini kaybedersiniz. Örneğin, kullanıcının tarayıcısı uygulamayı yeni bir sürüm dağıtan anda önbelleğe alma riskiyle karşı karşılasa, eski dağıtımdan bazı dosyaları ve bazıları yeni dağıtımdan önbelleğe alma riski vardır. Bu durumda, siz daha fazla güncelleştirme dağıtana kadar uygulama bozuk durumda takılıyor.

Barındırma Blazor WebAssembly modeli ile:

  • Uygulama, Blazor bağımlılıkları ve .NET çalışma zamanı tarayıcıya paralel olarak indirilir.
  • Uygulama doğrudan tarayıcı kullanıcı arabirimi iş parçacığında yürütülür.

Aşağıdaki dağıtım stratejileri de desteklenmeli:

  • Uygulama Blazor bir uygulama tarafından ASP.NET Core. Bu strateji, ASP.NET Core ile barındırılan dağıtım bölümünde ele almaktadır.
  • Uygulama, uygulamaya hizmet vermek için .NET'in kullanılmay olduğu statik bir barındırma Blazor web sunucusuna veya hizmetine Blazor yerleştirilir. Bu strateji, bir uygulamayı IIS alt uygulaması olarak barındırma hakkında bilgi içeren Tek başına dağıtım bölümünde Blazor WebAssembly ele almaktadır.

Önyükleme kaynaklarının nasıl yükleniyor olduğunu özelleştirme

API kullanarak önyükleme kaynaklarının nasıl yükleniyor olduğunu loadBootResource özelleştirin. Daha fazla bilgi için bkz. ASP.NET Core Blazor Başlangıç.

Sıkıştırma

Bir uygulama yayımlanırken, uygulamanın boyutunu azaltmak ve çalışma zamanı sıkıştırma yükünü kaldırmak için yayımlama sırasında Blazor WebAssembly çıkış statik olarak sıkıştırılır. Aşağıdaki sıkıştırma algoritmaları kullanılır:

Blazor , uygun sıkıştırılmış dosyaları hizmet etmek için ana bilgisayarı kullanır. Barındırılan bir ASP.NET Core kullanırken, konak projesi içerik anlaşması yapabilir ve statik olarak sıkıştırılmış dosyalara hizmet yapabilir. Tek başına Blazor WebAssembly bir uygulama barındırılırken, statik olarak sıkıştırılmış dosyaların hizmet olduğundan emin olmak için ek çalışma gerekebilir:

  • IIS sıkıştırma web.config yapılandırması için IIS: Brotli ve Gzip sıkıştırma bölümüne bakın.

  • GitHub Pages gibi statik olarak sıkıştırılmış dosya içeriği anlaşmasını desteklemeen statik barındırma çözümlerini barındırıyorsanız, uygulamayı Brotli sıkıştırılmış dosyalarını getirmek ve kodunu çözmek için yapılandırmayı göz önünde bulun:

    • google/brotli deposundan JavaScript Brotli kod GitHub alın. Minimum kod çözücü dosyası olarak decode.min.js adlandırılmıştır ve deponun klasöründe js bulunur.

      Not

      Betiğin en küçük decode.js sürümü ( ) başarısız decode.min.js olursa, bunun yerine belirlenemeyen sürümü ( decode.js ) kullanmayı deneyin.

    • Kodu çözücü kullanmak için uygulamayı güncelleştirin.

      dosyasında, wwwroot/index.html autostart false etiketinde olarak Blazor <script> ayarlayın:

      <script src="_framework/blazor.webassembly.js" autostart="false"></script>
      

      Blazoretiketinin <script> ardından ve kapanış </body> etiketinin önünde aşağıdaki JavaScript kod bloğuna <script> ekleyin:

      <script type="module">
        import { BrotliDecode } from './decode.min.js';
        Blazor.start({
          loadBootResource: function (type, name, defaultUri, integrity) {
            if (type !== 'dotnetjs' && location.hostname !== 'localhost') {
              return (async function () {
                const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
                if (!response.ok) {
                  throw new Error(response.statusText);
                }
                const originalResponseBuffer = await response.arrayBuffer();
                const originalResponseArray = new Int8Array(originalResponseBuffer);
                const decompressedResponseArray = BrotliDecode(originalResponseArray);
                const contentType = type === 
                  'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
                return new Response(decompressedResponseArray, 
                  { headers: { 'content-type': contentType } });
              })();
            }
          }
        });
      </script>
      

      Önyükleme kaynaklarını yükleme hakkında daha fazla bilgi için bkz. ASP.NET Core Blazor Başlangıç .

Sıkıştırmayı devre dışı bırakmak MSBuild uygulamanın proje dosyasına MSBuild özelliğini BlazorEnableCompression ekleyin ve değerini olarak false ayarlayın:

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

özelliği, BlazorEnableCompression komut kabuğunda dotnet publish aşağıdaki söz dizimi ile komuta geçirebilirsiniz:

dotnet publish -p:BlazorEnableCompression=false

Doğru yönlendirme için URL'leri yeniden yazma

Bir uygulamanın sayfa bileşenleri için Blazor WebAssembly yönlendirme istekleri, barındırılan bir uygulamasındaki yönlendirme istekleri kadar Blazor Server kolay değildir. İki bileşeni Blazor WebAssembly olan bir uygulamayı düşünün:

  • Main.razor: Uygulamanın köküne yüklenir ve bileşenin bağlantısını About içerir ( href="About" ).
  • About.razor: About bileşeni.

Uygulamanın varsayılan belgesi tarayıcının adres çubuğu kullanılarak istense (örneğin, https://www.contoso.com/ ):

  1. Tarayıcı bir istekte bulundu.
  2. Varsayılan sayfa döndürülür ve bu genellikle index.html olur.
  3. index.html uygulamayı önyükler.
  4. Blazor'nin yönlendiricisi yüklenir ve Razor Main bileşen işlenir.

Ana sayfada, bileşenin bağlantısını seçmek istemci üzerinde çalışır çünkü yönlendirici tarayıcının için İnternet'te istekte bulunarak işlenmiş bileşenin kendisine hizmet About Blazor www.contoso.com About About eder. Uygulama içindeki iç uç noktalara yapılan tüm istekler aynı şekilde çalışır: İstekler, İnternet'de sunucu tarafından barındırılan kaynaklara tarayıcı tabanlı istekleri tetiklemez. Blazor WebAssembly Yönlendirici istekleri dahili olarak ele almaktadır.

için tarayıcının adres çubuğu kullanılarak istek yapılırsa www.contoso.com/About istek başarısız olur. Uygulamanın İnternet ana bilgisayar üzerinde böyle bir kaynak yoktur, bu nedenle 404 - Bulunamadı yanıtı döndürülür.

Tarayıcılar istemci tarafı sayfalar için İnternet tabanlı konaklara istekte buluna olduğundan, web sunucuları ve barındırma hizmetleri sunucu üzerinde fiziksel olarak olmayan kaynaklar için tüm istekleri sayfaya yeniden index.html yazması gerekir. index.htmlDöndürülen uygulamanın yönlendiricisi, Blazor doğru kaynağı alır ve yanıt verir.

Iis sunucusuna dağıtım yapmak için URL Yeniden Yazma Modülünü uygulamanın yayımlanan dosyasıyla birlikte web.config kullanabilirsiniz. Daha fazla bilgi için IIS bölümüne bakın.

ASP.NET Core ile barındırılan dağıtım

Barındırılan dağıtım, uygulamayı Blazor WebAssembly web sunucusunda çalışan bir ASP.NET Core tarayıcılara hizmet verir.

İstemci uygulaması, sunucu uygulamasının diğer statik web varlıklarıyla birlikte Blazor WebAssembly /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot sunucu uygulamasının klasöründe yayımlanır. İki uygulama birlikte dağıtılır. Uygulama barındırma özelliğine sahip bir web ASP.NET Core gerekir. Barındırılan bir dağıtım için, Visual Studio Blazor WebAssembly (komutu kullanırken) seçeneğinin seçili olduğu Uygulama proje şablonunu (komutu kullanırken blazorwasm dotnet new şablon) Hosted -ho|--hosted dotnet new içerir.

Daha fazla bilgi için aşağıdaki makaleleri inceleyin:

Birden çok uygulama ile barındırılan Blazor WebAssembly dağıtım

Uygulama yapılandırması

Barındırılan Blazor çözümler birden çok uygulama için Blazor WebAssembly kullanılabilir.

Not

Bu bölümdeki örnek, Visual Studio çözümünün kullanımına başvurur, ancak Visual Studio ve Visual Studio çözümünün birden çok istemci uygulamanın barındırılan uygulamalar senaryosunda çalışması için gerekli Blazor WebAssembly değildir. Visual Studio'i Visual Studio için oluşturulan diğer {SOLUTION NAME}.sln dosyaları yoksayın Visual Studio.

Aşağıdaki örnekte:

  • İlk (ilk) istemci uygulaması, proje şablonundan oluşturulan bir çözümün varsayılan istemci Blazor WebAssembly projesidir. İlk istemci uygulamasına, 5001 bağlantı noktası veya bir ana bilgisayarı ile URL'den /FirstApp bir tarayıcıdan firstapp.com erişilebilir.
  • Çözüme ikinci bir istemci uygulaması eklenir: SecondBlazorApp.Client . İkinci istemci uygulamasına, 5002 bağlantı noktası veya bir ana bilgisayarı ile URL'den /SecondApp bir tarayıcıdan secondapp.com erişilebilir.

Barındırılan mevcut bir Blazor çözümü kullanın veya Barındırılan proje şablonundan Blazor yeni bir çözüm oluşturun:

  • İstemci uygulamasının proje dosyasında, projesinin <StaticWebAssetBasePath> statik varlıkları için temel yolu ayarlamak için değerine sahip bir <PropertyGroup> özelliği FirstApp ekleyin:

    <PropertyGroup>
      ...
      <StaticWebAssetBasePath>FirstApp</StaticWebAssetBasePath>
    </PropertyGroup>
    
  • Çözüme ikinci bir istemci uygulaması ekleyin:

    • Çözümün SecondClient klasörüne adlı bir klasör ekleyin. Proje şablonundan oluşturulan çözüm klasörü, klasör eklendikten sonra aşağıdaki çözüm SecondClient dosyasını ve klasörleri içerir:

      • Client (klasör)
      • SecondClient (klasör)
      • Server (klasör)
      • Shared (klasör)
      • {SOLUTION NAME}.sln (dosya)

      Yer {SOLUTION NAME} tutucu, çözümün adıdır.

    • Proje Blazor WebAssembly şablonundan SecondBlazorApp.Client klasöründe adlı bir uygulama SecondClient Blazor WebAssembly oluşturun.

    • Uygulamanın SecondBlazorApp.Client proje dosyasında:

      • değerine <StaticWebAssetBasePath> bir <PropertyGroup> özelliği SecondApp ekleyin:

        <PropertyGroup>
          ...
          <StaticWebAssetBasePath>SecondApp</StaticWebAssetBasePath>
        </PropertyGroup>
        
      • Projeye bir proje başvurusu Shared ekleyin:

        <ItemGroup>
          <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
        </ItemGroup>
        

        Yer {SOLUTION NAME} tutucu, çözümün adıdır.

  • Sunucu uygulamasının proje dosyasında, eklenen istemci uygulaması için bir proje SecondBlazorApp.Client başvurusu oluşturun:

    <ItemGroup>
      <ProjectReference Include="..\Client\{SOLUTION NAME}.Client.csproj" />
      <ProjectReference Include="..\SecondClient\SecondBlazorApp.Client.csproj" />
      <ProjectReference Include="..\Shared\{SOLUTION NAME}.Shared.csproj" />
    </ItemGroup>
    

    Yer {SOLUTION NAME} tutucu, çözümün adıdır.

  • Sunucu uygulamasının dosyasında, Properties/launchSettings.json applicationUrl Kestrel {SOLUTION NAME}.Server 5001 ve 5002 bağlantı noktalarında istemci uygulamalarına erişmek için profilin () dosyasını yapılandırabilirsiniz:

    "applicationUrl": "https://localhost:5001;https://localhost:5002",
    
  • Sunucu uygulamasının yönteminde ( ), çağrısının ardından Startup.Configure görünen aşağıdaki satırları Startup.cs UseHttpsRedirection kaldırın:

    -app.UseBlazorFrameworkFiles();
    -app.UseStaticFiles();
    
    -app.UseRouting();
    
    -app.UseEndpoints(endpoints =>
    -{
    -    endpoints.MapRazorPages();
    -    endpoints.MapControllers();
    -    endpoints.MapFallbackToFile("index.html");
    -});
    

    İstekleri istemci uygulamalarına eşleyen ara yazılım ekleme. Aşağıdaki örnek, şu durumlarda ara yazılımı çalıştıracak şekilde yapılandırır:

    • İstek bağlantı noktası, özgün istemci uygulaması için 5001 ya da eklenen istemci uygulaması için 5002 ' dir.

    • İstek Konağı, firstapp.com özgün istemci uygulaması ya da secondapp.com eklenen istemci uygulaması için.

      Not

      Bu bölümde gösterilen örnekte, için ek yapılandırma gerekir:

      • Örnek ana bilgisayar etki alanlarındaki uygulamalara erişme firstapp.com ve secondapp.com .
      • TLS güvenliğini etkinleştirmek için istemci uygulamalarına yönelik Sertifikalar (HTTPS).

      Gerekli yapılandırma Bu makalenin kapsamı dışındadır ve çözümün nasıl barındırıldığını bağlıdır. Daha fazla bilgi için bkz. konak ve dağıtım makaleleri.

    Aşağıdaki kodu satırların daha önce kaldırıldığı yere yerleştirin:

    app.MapWhen(ctx => ctx.Request.Host.Port == 5001 || 
        ctx.Request.Host.Equals("firstapp.com"), first =>
    {
        first.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/FirstApp" + ctx.Request.Path;
            return nxt();
        });
    
        first.UseBlazorFrameworkFiles("/FirstApp");
        first.UseStaticFiles();
        first.UseStaticFiles("/FirstApp");
        first.UseRouting();
    
        first.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/FirstApp/{*path:nonfile}", 
                "FirstApp/index.html");
        });
    });
    
    app.MapWhen(ctx => ctx.Request.Host.Port == 5002 || 
        ctx.Request.Host.Equals("secondapp.com"), second =>
    {
        second.Use((ctx, nxt) =>
        {
            ctx.Request.Path = "/SecondApp" + ctx.Request.Path;
            return nxt();
        });
    
        second.UseBlazorFrameworkFiles("/SecondApp");
        second.UseStaticFiles();
        second.UseStaticFiles("/SecondApp");
        second.UseRouting();
    
        second.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("/SecondApp/{*path:nonfile}", 
                "SecondApp/index.html");
        });
    });
    

    Hakkında daha fazla bilgi için UseStaticFiles bkz ASP.NET Core Blazor statik dosyalar ..

    Ve hakkında daha fazla bilgi için UseBlazorFrameworkFiles MapFallbackToFile aşağıdaki kaynaklara bakın:

    Not

    Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal main ASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Core release/5.0 5.0 sürümü için dalı seçin.

  • Sunucu uygulamasının Hava durumu tahmin denetleyicisi 'nde ( Controllers/WeatherForecastController.cs ), var olan yolu ( [Route("[controller]")] ) WeatherForecastController aşağıdaki yollarla değiştirin:

    [Route("FirstApp/[controller]")]
    [Route("SecondApp/[controller]")]
    

    Sunucu uygulamasının yöntemine eklenen ara yazılım, Startup.Configure gelen istekleri /WeatherForecast /FirstApp/WeatherForecast /SecondApp/WeatherForecast bağlantı noktasına (5001/5002) veya etki alanına () bağlı olarak ya da öğesine göre değiştirir firstapp.com / secondapp.com . Sunucu uygulamasından istemci uygulamalarına Hava durumu verilerini döndürmek için önceki denetleyici yolları gereklidir.

Birden çok uygulama için statik varlıklar ve sınıf kitaplıkları Blazor WebAssembly

Statik varlıklara başvurmak için aşağıdaki yaklaşımları kullanın:

  • Varlık, istemci uygulamasının wwwroot klasöründe olduğunda, yolu normal olarak belirtin:

    <img alt="..." src="/{PATH AND FILE NAME}" />
    

    {PATH AND FILE NAME}Yer tutucu, altında yol ve dosya adıdır wwwroot .

  • Varlık wwwroot bir Razor sınıf kitaplığı (RCL)klasöründe olduğunda, ' deki kılavuzluk uyarınca istemci uygulamasındaki statik varlığa başvurun Kullanıcı arabirimi ile Razor sınıf kitaplıklarında yeniden ASP.NET Core :

    <img alt="..." src="_content/{PACKAGE ID}/{PATH AND FILE NAME}" />
    

    {PACKAGE ID}Yer tutucu, kitaplığın paket kimliğidir. Proje dosyasında belirtilmemişse, paket KIMLIĞI varsayılan olarak projenin derleme adına sahiptir <PackageId> . {PATH AND FILE NAME}Yer tutucu, altında yol ve dosya adıdır wwwroot .

RCLs hakkında daha fazla bilgi için bkz.

Tek başına dağıtım

Tek başına dağıtım , Blazor WebAssembly uygulamaya doğrudan istemciler tarafından istenen statik dosyalar kümesi olarak hizmet verir. Herhangi bir statik dosya sunucusu, Blazor uygulamayı sunabilir.

Tek başına dağıtım varlıkları /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot klasörüne yayımlanır.

Azure App Service

Blazor WebAssemblyuygulamalar, uygulamayı ııs'de barındıran Windows Azure app Services 'a dağıtılabilir.

Tek başına bir Blazor WebAssembly uygulamanın Linux için Azure App Service dağıtımı şu anda desteklenmemektedir. Uygulamayı barındıracak bir Linux sunucu görüntüsü şu anda kullanılamıyor. Bu senaryoyu etkinleştirmek için iş devam ediyor.

Azure statik Web uygulaması

Daha fazla bilgi için bkz. öğretici: Blazor Azure statik Web Apps ile statik Web uygulaması oluşturma.

IIS

IIS, uygulamalar için özellikli bir statik dosya sunucusudur Blazor . IIS 'yi barındıracak şekilde yapılandırmak için Blazor bkz. IIS 'de statik Web sitesi oluşturma.

Yayımlanan varlıklar /bin/Release/{TARGET FRAMEWORK}/publish klasöründe oluşturulur. publishWeb sunucusunda veya barındırma hizmetinde klasörün içeriğini barındırın.

web.config

Bir Blazor Proje yayımlandığında, web.config aşağıdaki IIS yapılandırmasıyla bir dosya oluşturulur:

  • MIME türleri
  • Aşağıdaki MIME türleri için HTTP sıkıştırması etkindir:
    • application/octet-stream
    • application/wasm
  • URL yeniden yazma modülü kuralları oluşturuldu:
    • Uygulamanın statik varlıklarının bulunduğu alt dizini ( wwwroot/{PATH REQUESTED} ) sunar.
    • Dosya olmayan varlıklar için isteklerin statik varlıklar klasöründe () uygulamanın varsayılan belgesine yeniden yönlendirilmesi için SPA geri dönüş yönlendirmesi oluşturun wwwroot/index.html .

Özel bir web.config kullanma

Özel bir dosya kullanmak için web.config , özel web.config dosyayı proje klasörünün köküne yerleştirin. Projeyi uygulamanın proje dosyasında kullanarak IIS 'e özgü varlıkları yayımlayacak şekilde yapılandırın PublishIISAssets ve projeyi yayımlayın:

<PropertyGroup>
  <PublishIISAssets>true</PublishIISAssets>
</PropertyGroup>

URL yeniden yazma modülünü yükler

URL yeniden yazma modülü , URL 'leri yeniden yazmak için gereklidir. Modül varsayılan olarak yüklenmez ve bir Web sunucusu (IIS) rol hizmeti özelliği olarak yükleme için kullanılamaz. Modül IIS Web sitesinden indirilmelidir. Modülünü yüklemek için Web Platformu Yükleyicisi 'ni kullanın:

  1. Yerel olarak, URL yeniden yazma modülü İndirmeleri sayfasınagidin. Ingilizce sürümünde, WebPI yükleyicisini indirmek için WebPI ' ı seçin. Diğer diller için, yükleyiciyi indirmek üzere sunucu için uygun mimariyi (x86/x64) seçin.
  2. Yükleyiciyi sunucuya kopyalayın. Yükleyiciyi çalıştırın. , Install düğmesini seçin ve lisans koşullarını kabul edin. Yüklemesi tamamlandıktan sonra sunucu yeniden başlatması gerekli değildir.

Web sitesini yapılandırma

Web sitesinin fiziksel yolunu uygulamanın klasörüne ayarlayın. Klasör şunları içerir:

  • web.configWeb sitesini yapılandırmak için gereken yeniden yönlendirme kuralları ve dosya içerik türleri dahil olmak üzere IIS tarafından kullanılan dosya.
  • Uygulamanın statik varlık klasörü.

IIS alt uygulaması olarak barındırma

Tek başına bir uygulama bir IIS alt uygulaması olarak barındırılıyorsa, aşağıdakilerden birini yapın:

  • devralınan ASP.NET Core modülü işleyicisini devre dışı bırakın.

    Blazor web.config Dosyanın bölümüne bir bölüm ekleyerek uygulamanın yayımlanan dosyasındaki işleyiciyi kaldırın <handlers> <system.webServer> :

    <handlers>
      <remove name="aspNetCore" />
    </handlers>
    
  • Şu <system.webServer> şekilde ayarlanmış bir öğe kullanarak kök (üst) uygulamanın devralınmasını devre dışı bırakın <location> inheritInChildApplications false :

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <handlers>
            <add name="aspNetCore" ... />
          </handlers>
          <aspNetCore ... />
        </system.webServer>
      </location>
    </configuration>
    

    Not

    Kök (üst) uygulama bölümünün devralınmasını devre dışı bırakmak, <system.webServer> .NET SDK kullanılarak yayımlanan uygulamalar için varsayılan yapılandırmadır.

İşleyicinin kaldırılması veya devralma devre dışı bırakılması, uygulamanın temel yolunun yapılandırılmasınaek olarak gerçekleştirilir. Uygulamanın dosyasındaki uygulama temel yolunu, index.html IIS 'de alt uygulamayı yapılandırırken kullanılan IIS diğer adına ayarlayın.

Brotli ve gzip sıkıştırması

bu bölüm yalnızca tek başına uygulamalar için geçerlidir Blazor WebAssembly . barındırılan Blazor uygulamalar web.config , bu bölümde bağlantılı dosyayı değil, varsayılan bir ASP.NET Core uygulama dosyası kullanır.

IIS, web.config Blazor tek başına uygulamalar için Brotli veya gzip ile sıkıştırılmış varlıklar sunacak şekilde yapılandırılabilir Blazor WebAssembly . Örnek bir yapılandırma dosyası için bkz web.config ..

Örnek dosyanın ek yapılandırması web.config aşağıdaki senaryolarda gerekli olabilir:

  • Uygulamanın belirtimi aşağıdakilerden birini çağırır:
    • Örnek dosya tarafından yapılandırılmayan sıkıştırılmış dosyalara hizmet sunma web.config .
    • Sıkıştırılmış dosyalara, sıkıştırılmamış biçimde örnek dosya tarafından yapılandırılmış olarak sunma web.config .
  • Sunucunun IIS yapılandırması (örneğin, applicationHost.config ) sunucu DÜZEYINDE IIS Varsayılanları sağlar. Sunucu düzeyindeki yapılandırmaya bağlı olarak, uygulama örnek dosyanın içerenden farklı bir IIS yapılandırması gerektirebilir web.config .

Sorun giderme

500-Iç sunucu hatası ALıNMıŞSA ve IIS Yöneticisi Web sitesinin yapılandırmasına erişmeye çalışırken hatalar OLUŞTURURSA, URL yeniden yazma modülünün yüklü olduğunu doğrulayın. Modül yüklü olmadığında, web.config Dosya IIS tarafından ayrıştırılamaz. Bu, IIS yöneticisinin Web sitesinin yapılandırmasını ve Web sitesini, statik dosyaları hizmet olarak yüklemesini engeller Blazor .

IIS ile dağıtım sorunlarını giderme hakkında daha fazla bilgi için bkz Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme ..

Azure Storage

Azure Depolama statik dosya barındırma sunucusuz Blazor uygulama barındırılmasına olanak sağlar. özel etki alanı adları, Azure Content Delivery Network (CDN) ve HTTPS desteklenir.

Blob hizmeti bir depolama hesabında barındırılan statik Web sitesi için etkinleştirildiğinde:

  • Dizin belgesi adını olarak ayarlayın index.html .
  • Hata belge yolunu olarak ayarlayın index.html . Razor bileşenler ve diğer dosya olmayan uç noktaları, blob hizmeti tarafından depolanan statik içerikte fiziksel yollarda yer vermez. Yönlendiricinin işlemesi gereken bu kaynaklardan birine yönelik bir istek alındığında Blazor , blob hizmeti tarafından oluşturulan 404-bulunamayan hata, isteği hata belge yoluna yönlendirir. index.htmlBlob döndürülür ve yönlendirici yolu yükler ve Blazor işler.

Dosyaların üst bilgilerinde uygun olmayan MIME türleri nedeniyle dosyalar çalışma zamanında yüklenmezse Content-Type aşağıdaki eylemlerden birini gerçekleştirin:

  • Dosyalar dağıtıldığında doğru MIME türlerini ( Content-Type üst bilgileri) ayarlamak için araçlarınızı yapılandırma.

  • Uygulama dağıtıldıktan sonra dosyalar için MIME türlerini ( Content-Type üst bilgileri) değiştirme.

    Her Depolama Gezgini (Azure portal) içinde:

    1. Dosyaya sağ tıklayın ve Özellikler’i seçin.
    2. ContentType'ı ayarlayın ve Kaydet düğmesini seçin.

Daha fazla bilgi için bkz. Azure'da statik web sitesi Depolama.

Nginx

Aşağıdaki nginx.conf dosya, diskte karşılık gelen bir dosyayı bulamadı mı Nginx'i dosya gönderecek şekilde index.html yapılandırmayı gösterecek şekilde basitleştirilmiştir.

events { }
http {
    server {
        listen 80;

        location / {
            root      /usr/share/nginx/html;
            try_files $uri $uri/ /index.html =404;
        }
    }
}

ile NGINX seri hız sınırını ayarlarken, uygulamalar bir uygulama tarafından yapılan nispeten çok sayıda isteği karşılamak için büyük limit_req bir parametre değeri Blazor WebAssembly burst gerektirir. Başlangıçta değeri en az 60 olarak ayarlayın:

http {
    server {
        ...

        location / {
            ...

            limit_req zone=one burst=60 nodelay;
        }
    }
}

Tarayıcı geliştirici araçları veya ağ trafiği aracı isteklerin 503 - Hizmet Kullanılamıyor durum kodunu aldığını gösteriyorsa değeri artırın.

Üretim Nginx web sunucusu yapılandırması hakkında daha fazla bilgi için bkz. NGINX Plus ve NGINX Yapılandırma Dosyaları Oluşturma.

Apache

Blazor WebAssemblyCentOS 7 veya sonraki bir cihaza uygulama dağıtmak için:

  1. Apache yapılandırma dosyasını oluşturun. Aşağıdaki örnek, basitleştirilmiş bir yapılandırma dosyasıdır ( blazorapp.config ):

    <VirtualHost *:80>
        ServerName www.example.com
        ServerAlias *.example.com
    
        DocumentRoot "/var/www/blazorapp"
        ErrorDocument 404 /index.html
    
        AddType application/wasm .wasm
        AddType application/octet-stream .dll
    
        <Directory "/var/www/blazorapp">
            Options -Indexes
            AllowOverride None
        </Directory>
    
        <IfModule mod_deflate.c>
            AddOutputFilterByType DEFLATE text/css
            AddOutputFilterByType DEFLATE application/javascript
            AddOutputFilterByType DEFLATE text/html
            AddOutputFilterByType DEFLATE application/octet-stream
            AddOutputFilterByType DEFLATE application/wasm
            <IfModule mod_setenvif.c>
          BrowserMatch ^Mozilla/4 gzip-only-text/html
          BrowserMatch ^Mozilla/4.0[678] no-gzip
          BrowserMatch bMSIE !no-gzip !gzip-only-text/html
      </IfModule>
        </IfModule>
    
        ErrorLog /var/log/httpd/blazorapp-error.log
        CustomLog /var/log/httpd/blazorapp-access.log common
    </VirtualHost>
    
  2. Apache yapılandırma dosyasını /etc/httpd/conf.d/ CentOS 7'de varsayılan Apache yapılandırma dizini olan dizine alın.

  3. Uygulamanın dosyalarını dizinine /var/www/blazorapp (yapılandırma dosyasında belirtilen DocumentRoot konum) yer alır.

  4. Apache hizmetini yeniden başlatın.

Daha fazla bilgi için bkz. mod_mime ve mod_deflate .

GitHub Pages

URL yeniden yazmalarını işlemek için, isteği wwwroot/404.html sayfaya yönlendiren bir betik ile bir dosya index.html ekleyin. Bir örnek için, steveSclientsonMS/ Blazor OnGitHubPages GitHub bakın:

Bir kuruluş sitesi yerine proje sitesi kullanırken, içinde <base> etiketini wwwroot/index.html güncelleştirin. Öznitelik href değerini, sonda eğik GitHub depo adına ayarlayın (örneğin, /my-repository/ ). SteveSpagesonMS/ Blazor OnGitHubPages GitHubdeposunda, temel yapılandırma dosyası tarafından href yayımlanarak .github/workflows/main.yml güncelleştirilir.

Not

SteveSclientsonMS/ Blazor OnGitHubPages GitHub deposu .NET Foundation veya Microsoft tarafından sahip olunamaz, bakıma alınamaz veya desteklenmiyor.

Konak yapılandırma değerleri

Blazor WebAssembly uygulamaları, geliştirme ortamında çalışma zamanında komut satırı bağımsız değişkenleri olarak aşağıdaki konak yapılandırma değerlerini kabul eder.

İçerik kökü

bağımsız --contentroot değişkeni, uygulamanın içerik dosyalarını (içerik kökü) içeren dizinin mutlakyolunu ayarlar. Aşağıdaki örneklerde /content-root-path uygulamanın içerik kök yolu verilmiştir.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --contentroot=/content-root-path
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir IIS Express ekleyin. Bu ayar, uygulama Visual Studio Debugger ile ve ile bir komut isteminden çalıştır çalıştır olduğunda dotnet run kullanılır.

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • Bu Visual Studio, Özellikler Uygulama bağımsız değişkenlerini > hata ayıklama içinde bağımsız > değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişken ayarlanmaz. launchSettings.json

    --contentroot=/content-root-path
    

Yol tabanı

bağımsız değişkeni, kök olmayan göreli URL yolu ile yerel olarak çalıştırilen bir uygulamanın uygulama temel yolunu ayarlar (etiket hazırlama ve üretim dışında --pathbase <base> bir yola href / ayarlanır). Aşağıdaki örneklerde /relative-URL-path uygulamanın yol tabanı verilmiştir. Daha fazla bilgi için bkz. Uygulama temel yolu.

Önemli

etiketinde sağlanan href yoldan farklı olarak, bağımsız değişken değerini iletirken sonda eğik <base> çizgi ( ) dahil / --pathbase etme. Uygulama temel yolu etikette olarak sağlanıyorsa (sonda bir eğik çizgi içerir), komut satırı bağımsız değişken değerini <base> <base href="/CoolApp/"> olarak --pathbase=/CoolApp (sonda eğik çizgi yok) olarak geçişin.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --pathbase=/relative-URL-path
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir IIS Express ekleyin. Bu ayar, uygulamayı Visual Studio Debugger ile ve ile bir komut isteminden çalıştırarak dotnet run kullanılır.

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • Bu Visual Studio, Özellikler Uygulama bağımsız değişkenlerini > hata ayıklama içinde bağımsız > değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişken ayarlanmaz. launchSettings.json

    --pathbase=/relative-URL-path
    

URL’ler

bağımsız --urls değişkeni, ip adreslerini veya ana bilgisayar adreslerini istekleri dinleyecek bağlantı noktaları ve protokollerle ayarlar.

  • Uygulamayı yerel olarak komut isteminde çalıştırarak bağımsız değişkenlerini kullanın. Uygulamanın dizininden şunları yürütün:

    dotnet run --urls=http://127.0.0.1:0
    
  • IIS Express profilinde launchSettings.json uygulamanın dosyasına bir IIS Express ekleyin. Bu ayar, uygulamayı Visual Studio Debugger ile ve ile bir komut isteminden çalıştırarak dotnet run kullanılır.

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • Bu Visual Studio, Özellikler Uygulama bağımsız değişkenlerini > hata ayıklama içinde bağımsız > değişkenlerini belirtin. Visual Studio özelliği sayfasındaki bağımsız değişken ayarlanmaz. launchSettings.json

    --urls=http://127.0.0.1:0
    

Bağlayıcıyı yapılandırma

Blazor , çıkış derlemelerinden gereksiz IL'i kaldırmak için her Yayın derlemesi üzerinde Ara Dil (IL) bağlantısı gerçekleştirir. Daha fazla bilgi için bkz. ASP.NET Core için bağlayıcı yapılandırma Blazor.

DLL dosyalarının dosya adı uzantısını değiştirme

Uygulamanın yayımlanan dosyalarının dosya adı uzantılarını değiştirmek zorundaysanız .dll bu bölümdeki yönergeleri izleyin.

Uygulamayı yayımlandıktan sonra, dosyaları farklı bir dosya uzantısı DevOps yeniden adlandırmak için bir kabuk betiği veya derleme .dll işlem hattı kullanın. Uygulamanın .dll yayımlanan wwwroot çıkışının dizininde yer alan dosyaları hedefle (örneğin, {CONTENT ROOT}/bin/Release/netstandard2.1/publish/wwwroot ).

Aşağıdaki örneklerde, .dll dosyalar dosya uzantısını kullanmak üzere yeniden .bin adlandırıldı.

Windows'da:

dir .\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content .\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content .\_framework\blazor.boot.json

Hizmet çalışanı varlıkları da kullanıyorsa aşağıdaki komutu ekleyin:

((Get-Content .\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content .\service-worker-assets.js

Linux veya macOS'ta:

for f in _framework/_bin/*; do mv "$f" "`echo $f | sed -e 's/\.dll/.bin/g'`"; done
sed -i 's/\.dll"/.bin"/g' _framework/blazor.boot.json

Hizmet çalışanı varlıkları da kullanıyorsa aşağıdaki komutu ekleyin:

sed -i 's/\.dll"/.bin"/g' service-worker-assets.js

'den farklı bir dosya uzantısı kullanmak .bin için, .bin önceki komutlarda değiştirin.

Sıkıştırılmış ve dosyaları blazor.boot.json.gz ele edinmek için aşağıdaki blazor.boot.json.br yaklaşımlardan birini benimsersiniz:

  • Sıkıştırılmış ve blazor.boot.json.gz dosyalarını blazor.boot.json.br kaldırın. Sıkıştırma bu yaklaşımla devre dışı bırakılmıştır.
  • Güncelleştirilmiş dosyayı yeniden blazor.boot.json sıkıştırır.

Yukarıdaki kılavuz, hizmet çalışanı varlıkları kullanımda olduğunda da geçerlidir. ve 'i kaldırın veya yeniden wwwroot/service-worker-assets.js.br wwwroot/service-worker-assets.js.gz sıkıştırin. Aksi takdirde, tarayıcıda dosya bütünlüğü denetimleri başarısız olur.

Aşağıdaki Windows, projenin köküne yerleştirilen bir PowerShell betiği kullanır.

ChangeDLLExtensions.ps1::

param([string]$filepath,[string]$tfm)
dir $filepath\bin\Release\$tfm\wwwroot\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\bin\Release\$tfm\wwwroot\_framework\blazor.boot.json.gz

Hizmet çalışanı varlıkları da kullanıyorsa aşağıdaki komutu ekleyin:

((Get-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\bin\Release\$tfm\wwwroot\service-worker-assets.js

Proje dosyasında, betik uygulamayı yayımlandıktan sonra çalıştır:

<Target Name="ChangeDLLFileExtensions" AfterTargets="Publish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; { .\ChangeDLLExtensions.ps1 '$(SolutionDir)' '$(TargetFramework)'}&quot;" />
</Target>

Not

Aynı derlemeleri yeniden ve yavaş yüklerken, içinde kılavuzuna Derlemelerde yavaş yükleme derlemeleri ASP.NET Core Blazor WebAssembly bakın.

Bütünlük denetimi hatalarını çözme

Bir Blazor WebAssembly uygulamanın başlangıç dosyalarını indirdiği zaman tarayıcıdan yanıtlarda bütünlük denetimleri gerçekleştirmesini sağlar. , ve diğer dosyalar için beklenen SHA-256 karma değerlerini belirtmek blazor.boot.json için .dll .wasm dosyasındaki bilgileri kullanır. Bu, aşağıdaki nedenlerden dolayı yararlıdır:

  • Örneğin, kullanıcı uygulama dosyalarını indirme sürecindeyken web sunucunuza yeni bir dağıtım uygulanmışsa, tutarsız bir dosya kümesi yükleme riskiyle karşınıza dönmenizi sağlar. Tutarsız dosyalar tanımsız davranışlara yol açabilirsiniz.
  • Kullanıcının tarayıcısında hiçbir zaman tutarsız veya geçersiz yanıtlar önbelleğe alınmaz ve bu da sayfayı el ile yenilese bile uygulamayı başlatmasını önleyebilirsiniz.
  • Beklenen SHA-256 karmaları değişinceye kadar yanıtların önbelleğe alınarak sunucu tarafı değişikliklerinin bile kontrol esneti; dolayısıyla sonraki sayfa yüklemeleri daha az istek içerir ve çok daha hızlı tamamlanır.

Web sunucunuz beklenen SHA-256 karmaları ile eşleşmeden yanıtlar döndürürse, tarayıcının geliştirici konsolunda aşağıdakine benzer bir hata görüntülenir:

https://myapp.example.com/\_framework/My Blazor 'IIa70iwvmEg5WiDV17OpQ5eCztNYqL186J56852RpJY=' hesaplanan SHA-256 bütünlüğü ile 'App.dll' kaynağı için 'bütünlük' özniteliğinde geçerli bir özet bulunamadı. Kaynak engellendi.

Çoğu durumda bu, bütünlük denetimiyle ilgili bir sorun değildir. Bunun yerine başka bir sorun olduğu anlamına gelir ve bütünlük denetimi sizi diğer sorun hakkında uyaracak.

Bütünlük sorunlarını tanılama

Bir uygulama oluşturulurken oluşturulan bildirim, derleme çıkışının üretil olduğu zaman önyükleme kaynaklarınızı blazor.boot.json (örneğin, , ve diğer dosyalar) SHA-256 .dll .wasm karmalarını açıklar. içinde SHA-256 karmaları tarayıcıya teslim edilen dosyalarda eş olduğu sürece blazor.boot.json bütünlük denetimi başarılı olur.

Bu hatanın yaygın nedenleri:

  • Web sunucusunun yanıtı, tarayıcının istenen dosyası yerine bir hatadır (örneğin, 404 - Bulunamadı veya 500 - İç Sunucu Hatası). Bu, tarayıcı tarafından yanıt hatası olarak değil bütünlük denetimi hatası olarak raporlandı.
  • Derleme ile dosyaların tarayıcıya teslimi arasında dosyaların içeriğini değiştiren bir şey var. Bu durum şu şekilde olabilir:
    • Siz veya derleme araçları derleme çıkışını el ile değiştirirse.
    • Dağıtım işleminin bazı yönleri dosyaları değiştirse. Örneğin, Git tabanlı bir dağıtım mekanizması kullanıyorsanız, Windows üzerinde dosya işler ve Linux'ta bunları kontrol edersiniz, Git'in saydam bir şekilde Windows stilinde satır sonlarını Unix stili satır sonlarına dönüştür olduğunu unutmayın. Dosya satırı bitişlerini değiştirmek SHA-256 karmalarını değiştirir. Bu sorunu önlemek için, derleme .gitattributes yapıtlarını dosya olarak ele alan kullanmayı göz önünde binary bulundurabilirsiniz.
    • Web sunucusu, dosya içeriklerini, bunları sunan bir parçası olarak değiştiren bir dosyadır. Örneğin, bazı içerik dağıtım ağları (CDN'ler) HTML'yi otomatik olarak en az olacak şekilde değiştirmeyi dener. Bu tür özellikleri devre dışı bırakmanız gerekir.

Bunların hangilerinin sizin durumunıza uygulanacağı tanılamak için:

  1. Hata iletisini okuyarak hatayı tetikleyen dosyayı not edin.
  2. Tarayıcınızın geliştirici araçlarını açın ve Ağ sekmesine bakın. Gerekirse, istek ve yanıt listesini görmek için sayfayı yeniden yükleyin. Bu listede hatayı tetikleyen dosyayı bulun.
  3. Yanıtta HTTP durum kodunu kontrol edin. Sunucu 200 - Tamam (veya başka bir 2xx durum kodu) dışında bir şey döndürürse, tanılamak için sunucu tarafı bir sorun olur. Örneğin, durum kodu 403 bir yetkilendirme sorunu olduğu anlamına gelirken, 500 durum kodu sunucunun belirtilmemiş bir şekilde başarısız olduğu anlamına gelir. Uygulamayı tanılamak ve düzeltmek için sunucu tarafı günlüklerine danışın.
  4. Durum kodu 200 - Kaynak için tamam ise, tarayıcının geliştirici araçlarında yanıt içeriğine bakın ve içeriğin beklenen verilerle eş olup olamay olduğunu kontrol edin. Örneğin, isteklerin diğer dosyalar için bile verilerinizi iade etmek için yönlendirmeyi yanlış yapılandırması yaygın index.html bir sorundur. İsteklere verilen yanıtların WebAssembly ikilileri olduğundan ve isteklere verilen yanıtların .NET derleme .wasm .dll ikilileri olduğundan emin olun. Yoksa, tanılamak için bir sunucu tarafı yönlendirme problemin var demektir.
  5. Bütünlük sorunlarını giderme PowerShell betiğiyle uygulamanın yayımlanan ve dağıtılan çıkışını doğrulamayı seçin.

Sunucunun makul bir şekilde doğru veri döndürerek döndüren bir şey olduğunu onaylarsanız, dosyanın derlemesi ile teslimi arasında içindeki içeriği başka bir değişiklikle değiştirerek başka bir şey olması gerekir. Bunu araştırmak için:

  • Dosyalar yapılandır edildikten sonra dosyaları değiştirmeleri durumunda derleme araçlık ve dağıtım mekanizmasını inceleme. Bunun bir örneği, Git'in daha önce açıklandığı gibi dosya satırı bitişlerini dönüştürmesidir.
  • Yanıtları dinamik olarak değiştirmek CDN (örneğin, HTML'yi en küçük yapılandırmasını yapmaya çalışma) durumunda web sunucusunu veya sunucu yapılandırmayı inceleme. Web sunucusunun HTTP sıkıştırması (örneğin, veya döndürerek) uygulaması normaldir, çünkü bu durum sıkıştırmadan sonra content-encoding: br content-encoding: gzip sonucu etkilemez. Ancak web sunucusunun sıkıştırılmamış verileri değiştirmesi uygun değildir.

Bütünlükle ilgili sorunları giderme PowerShell betiği

Yayımlanmış ve integrity.ps1 dağıtılan bir uygulamayı doğrulamak için PowerShell betiği Blazor kullanın. Uygulamanın çerçevenin tanım PowerShell Core bütünlük sorunları olduğunda başlangıç noktası olarak PowerShell Core 6 Blazor için betik sağlanır. PowerShell'in 6.2.7 sürümünden sonraki bir sürümünde çalışıyorsanız da dahil olmak üzere, uygulamalarınız için betiğin özelleştirilmesi gerekebilir.

Betik, klasördeki dosyaları denetler ve bütünlük karmaları içeren farklı bildirimlerde sorunları algılamak publish için dağıtılan uygulamadan indirilir. Bu denetimler en yaygın sorunları algılamalı:

  • Yayımlanan çıktıda bir dosyayı fark etmeden değiştirebilirsiniz.
  • Uygulama dağıtım hedefine doğru dağıtılamadı veya dağıtım hedefinin ortamında bir şey değişti.
  • Dağıtılan uygulama ile uygulamayı yayımlama çıkışı arasında farklar vardır.

PowerShell komut kabuğunda aşağıdaki komutla betiği çağırabilirsiniz:

.\integrity.ps1 {BASE URL} {PUBLISH OUTPUT FOLDER}

Yer tutucu:

  • {BASE URL}: Dağıtılan uygulamanın URL'si.
  • {PUBLISH OUTPUT FOLDER}: Uygulamanın klasörünün publish veya uygulamanın dağıtım için yayımladığı konumun yolu.

Not

Depoyu kopya dotnet/AspNetCore.Docs GitHub betik integrity.ps1 Bitdefender veya sistemde bulunan başka bir virüs tarayıcısı tarafından karantinaya alınmış olabilir. Genellikle, dosya bir virüs tarayıcısının, yalnızca kötü amaçlı yazılım varlığını işaret ediyor olabilir dosya desenlerini incelemektedir. Virüs tarayıcısının dosyayı quarantining'i önlemek için, dosyayı kopyalamadan önce virüs tarayıcısına bir özel durum ekleyin. Aşağıdaki örnek, bir Windows sistemi üzerinde betiğin tipik bir yoludur. Yolu diğer sistemler için gereken şekilde ayarlayın. Yer {USER} tutucu, kullanıcının yol kesimidir.

C:\Users\{USER}\Documents\GitHub\AspNetCore.Docs\aspnetcore\blazor\host-and-deploy\webassembly\_samples\integrity.ps1

Uyarı: Virüs tarayıcısı özel durumları oluşturmak tehlikelidir ve yalnızca dosyanın güvenli olduğu konusunda emin olunan durumlarda gerçekleştir yapılmalıdır.

Bir dosyanın sağlamalarının geçerli bir sağlama süresi değeriyle karşılaştırılması dosya güvenliğini garantilemez, ancak bir dosyayı sağlama sağlama değeri bulunduracak şekilde değiştirmek kötü amaçlı kullanıcılar için önemsiz değildir. Bu nedenle sağlamaları genel bir güvenlik yaklaşımı olarak yararlıdır. Yerel dosyanın sağlamalarını integrity.ps1 aşağıdaki değerlerden biri ile karşılaştırın:

  • SHA256: 6b0dc7aba5d8489136bb2969036432597615b11b4e432535e173ca077a0449c4
  • MD5: f0c800a4c72604bd47f3c19f5f0bb4f4

Aşağıdaki komutla dosyanın sağlama Windows işletim sistemi alın. Yer tutucu için yol ve dosya adını girin ve yer tutucu için üretecek sağlama sağlamalarının türünü (veya {PATH AND FILE NAME} {SHA512|MD5} ) SHA256 MD5 belirtir:

CertUtil -hashfile {PATH AND FILE NAME} {SHA256|MD5}

Sağlama tamı doğrulamanın ortamınız için yeterince güvenli olup olmadığını merak ediyorsanız, rehberlik için kuruluşun güvenlik liderliğine danışın.

Daha fazla bilgi için bkz. Kötü amaçlı yazılımları ve & anlama.

Veri olmayan uygulamalar için bütünlük PWA devre dışı bırakma

Çoğu durumda bütünlük denetimi devre dışı bırakmayın. Bütünlük denetimi devre dışı bırakarak beklenmeyen yanıtlara neden olan ve daha önce listelenen avantajların kaybedildiği temel sorun çözülz.

Web sunucusunun tutarlı yanıtlar sağlamak için dayanamayaları olabilir ve bütünlük denetimlerini devre dışı bırakmaktan başka bir seçeneğiniz yoktur. Bütünlük denetimlerini devre dışı bırakmak için, projenin dosyasındaki bir Blazor WebAssembly özellik grubuna şunları .csproj ekleyin:

<BlazorCacheBootResources>false</BlazorCacheBootResources>

BlazorCacheBootResources ayrıca özelliği, SHA-256 karmalarının doğru olması için güvenilemediğini işaret etmelerinden dolayı , ve diğer dosyaları Blazor .dll SHA-256 karmalarına göre önbelleğe alma varsayılan davranışını devre dışı .wasm bırakmaktadır. Bu ayarla bile, tarayıcının normal HTTP önbelleği yine de bu dosyaları önbelleğe alır, ancak bunun olup olmadığı web sunucusu yapılandırmanıza ve hizmet ettiği üst cache-control bilgilere bağlıdır.

Not

özelliği BlazorCacheBootResources Aşamalı Web Uygulamaları (PWAs) için bütünlük denetimlerini devre dışı bırakmaz. PWA'lar hakkında rehberlik için PWAs için bütünlük denetlemeyi devre dışı bırakma bölümüne bakın.

PWA'lar için bütünlük denetlemesini devre dışı bırakma

Blazor'nin Aşamalı Web Uygulaması (PWA) şablonu, uygulama dosyalarını çevrimdışı kullanım için getirmek ve depolamakla sorumlu olan service-worker.published.js önerilen bir dosya içerir. Bu, normal uygulama başlatma mekanizmasından ayrı bir işlemdir ve kendi ayrı bütünlük denetimi mantığına sahiptir.

Dosyanın service-worker.published.js içinde aşağıdaki satır mevcuttur:

.map(asset => new Request(asset.url, { integrity: asset.hash }));

Bütünlük denetlemeyi devre dışı bırakmak integrity için, satırı aşağıdaki gibi değiştirerek parametresini kaldırın:

.map(asset => new Request(asset.url));

Yine bütünlük denetimi devre dışı bırakarak, bütünlük denetimi tarafından sunulan güvenlik garantilerini kaybedersiniz. Örneğin, kullanıcının tarayıcısı uygulamayı yeni bir sürüm dağıtan anda önbelleğe alma riskiyle karşı karşılasa, eski dağıtımdan bazı dosyaları ve bazıları yeni dağıtımdan önbelleğe alma riski vardır. Bu durumda, siz daha fazla güncelleştirme dağıtana kadar uygulama bozuk durumda takılıyor.