Bagikan melalui


Menggunakan rakitan startup hosting di ASP.NET Core

Oleh Pavel Krymets

IHostingStartup Implementasi (startup hosting) menambahkan penyempurnaan ke aplikasi saat startup dari rakitan eksternal. Misalnya, pustaka eksternal dapat menggunakan implementasi startup hosting untuk menyediakan penyedia konfigurasi atau layanan tambahan ke aplikasi.

Melihat atau mengunduh kode sampel (cara mengunduh)

Atribut HostingStartup

Atribut HostingStartup menunjukkan adanya perakitan startup hosting untuk diaktifkan saat runtime.

Rakitan entri atau rakitan yang berisi Startup kelas secara otomatis dipindai untuk HostingStartup atribut . Daftar rakitan untuk HostingStartup mencari atribut dimuat saat runtime dari konfigurasi di WebHostDefaults.HostingStartupAssembliesKey. Daftar rakitan yang akan dikecualikan dari penemuan dimuat dari WebHostDefaults.HostingStartupExcludeAssembliesKey.

Dalam contoh berikut, namespace perakitan startup hosting adalah StartupEnhancement. Kelas yang berisi kode startup hosting adalah StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Atribut HostingStartup ini biasanya terletak di file kelas implementasi perakitan IHostingStartup startup hosting.

Menemukan rakitan startup hosting yang dimuat

Untuk menemukan rakitan startup hosting yang dimuat, aktifkan pengelogan dan periksa log aplikasi. Kesalahan yang terjadi saat memuat rakitan dicatat. Rakitan startup hosting yang dimuat dicatat di tingkat Debug, dan semua kesalahan dicatat.

Menonaktifkan pemuatan otomatis rakitan startup hosting

Untuk menonaktifkan pemuatan otomatis rakitan startup hosting, gunakan salah satu pendekatan berikut:

  • Untuk mencegah semua rakitan startup hosting dimuat, atur salah satu hal berikut ke true atau 1:

    • Cegah pengaturan konfigurasi host Hosting Startup:

      public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseSetting(
                          WebHostDefaults.PreventHostingStartupKey, "true")
                      .UseStartup<Startup>();
              });
      
    • ASPNETCORE_PREVENTHOSTINGSTARTUP variabel lingkungan.

  • Untuk mencegah rakitan startup hosting tertentu dimuat, atur salah satu hal berikut ke string rakitan startup hosting yang dibatasi titik koma untuk dikecualikan saat startup:

    • Pengaturan konfigurasi host Hosting Startup Exclude Assemblies:

      public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseSetting(
                          WebHostDefaults.HostingStartupExcludeAssembliesKey, 
                          "{ASSEMBLY1;ASSEMBLY2; ...}")
                      .UseStartup<Startup>();
              });
      

      Tempat {ASSEMBLY1;ASSEMBLY2; ...} penampung mewakili daftar rakitan yang dipisahkan titik koma.

    • ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES variabel lingkungan.

Jika pengaturan konfigurasi host dan variabel lingkungan diatur, pengaturan host mengontrol perilaku.

Menonaktifkan rakitan startup hosting menggunakan pengaturan host atau variabel lingkungan menonaktifkan perakitan secara global dan dapat menonaktifkan beberapa karakteristik aplikasi.

Project

Buat startup hosting dengan salah satu jenis proyek berikut:

Pustaka kelas

Penyempurnaan startup hosting dapat disediakan di pustaka kelas. Pustaka berisi HostingStartup atribut.

Kode sampel mencakup Razor aplikasi Pages, HostingStartupApp, dan pustaka kelas, HostingStartupLibrary. Pustaka kelas:

  • Berisi kelas startup hosting, ServiceKeyInjection, yang mengimplementasikan IHostingStartup. ServiceKeyInjection menambahkan sepasang string layanan ke konfigurasi aplikasi menggunakan penyedia konfigurasi dalam memori (AddInMemoryCollection).
  • HostingStartup Menyertakan atribut yang mengidentifikasi namespace layanan dan kelas startup hosting.

Metode ServiceKeyInjection kelas Configure menggunakan IWebHostBuilder untuk menambahkan penyempurnaan ke aplikasi.

HostingStartupLibrary/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]

namespace HostingStartupLibrary
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromLibrary", "DEV_1111111-1111"},
                    {"ProdAccount_FromLibrary", "PROD_2222222-2222"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Halaman Indeks aplikasi membaca dan merender nilai konfigurasi untuk dua kunci yang ditetapkan oleh rakitan startup hosting pustaka kelas:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Kode sampel juga mencakup proyek paket NuGet yang menyediakan startup hosting terpisah, HostingStartupPackage. Paket ini memiliki karakteristik yang sama dari pustaka kelas yang dijelaskan sebelumnya. Paket:

  • Berisi kelas startup hosting, ServiceKeyInjection, yang mengimplementasikan IHostingStartup. ServiceKeyInjection menambahkan sepasang string layanan ke konfigurasi aplikasi.
  • HostingStartup Menyertakan atribut.

HostingStartupPackage/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupPackage.ServiceKeyInjection))]

namespace HostingStartupPackage
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromPackage", "DEV_3333333-3333"},
                    {"ProdAccount_FromPackage", "PROD_4444444-4444"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Halaman Indeks aplikasi membaca dan merender nilai konfigurasi untuk dua kunci yang ditetapkan oleh rakitan startup hosting paket:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Aplikasi konsol tanpa titik masuk

Pendekatan ini hanya tersedia untuk aplikasi .NET Core, bukan .NET Framework.

Peningkatan startup hosting dinamis yang tidak memerlukan referensi waktu kompilasi untuk aktivasi dapat disediakan di aplikasi konsol tanpa titik masuk yang berisi HostingStartup atribut. Menerbitkan aplikasi konsol menghasilkan rakitan startup hosting yang dapat dikonsumsi dari penyimpanan runtime.

Aplikasi konsol tanpa titik masuk digunakan dalam proses ini karena:

  • File dependensi diperlukan untuk menggunakan startup hosting di perakitan startup hosting. File dependensi adalah aset aplikasi yang dapat dijalankan yang diproduksi dengan menerbitkan aplikasi, bukan pustaka.
  • Pustaka tidak dapat ditambahkan langsung ke penyimpanan paket runtime, yang memerlukan proyek yang dapat dijalankan yang menargetkan runtime bersama.

Dalam pembuatan startup hosting dinamis:

  • Rakitan startup hosting dibuat dari aplikasi konsol tanpa titik masuk yang:
  • Aplikasi konsol diterbitkan untuk mendapatkan dependensi startup hosting. Konsekuensi dari penerbitan aplikasi konsol adalah bahwa dependensi yang tidak digunakan dipangkas dari file dependensi.
  • File dependensi dimodifikasi untuk mengatur lokasi runtime perakitan startup hosting.
  • Perakitan startup hosting dan file dependensinya ditempatkan ke dalam penyimpanan paket runtime. Untuk menemukan perakitan startup hosting dan file dependensinya, mereka tercantum dalam sepasang variabel lingkungan.

Aplikasi konsol mereferensikan paket Microsoft.AspNetCore.Hosting.Abstractions :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" 
                      Version="3.0.0" />
  </ItemGroup>

</Project>

Atribut HostingStartup mengidentifikasi kelas sebagai implementasi IHostingStartup untuk pemuatan dan eksekusi saat membangun IWebHost. Dalam contoh berikut, namespace adalah StartupEnhancement, dan kelasnya adalah StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Kelas mengimplementasikan IHostingStartup. Metode kelas Configure menggunakan IWebHostBuilder untuk menambahkan penyempurnaan ke aplikasi. IHostingStartup.Configure di rakitan startup hosting dipanggil oleh runtime sebelumnya Startup.Configure dalam kode pengguna, yang memungkinkan kode pengguna untuk menimpa konfigurasi apa pun yang disediakan oleh perakitan startup hosting.

namespace StartupEnhancement
{
    public class StartupEnhancementHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            // Use the IWebHostBuilder to add app enhancements.
        }
    }
}

Saat membangun IHostingStartup proyek, file dependensi (.deps.json) mengatur runtime lokasi perakitan ke folder bin :

"targets": {
  ".NETCoreApp,Version=v3.0": {
    "StartupEnhancement/1.0.0": {
      "dependencies": {
        "Microsoft.AspNetCore.Hosting.Abstractions": "3.0.0"
      },
      "runtime": {
        "StartupEnhancement.dll": {}
      }
    }
  }
}

Hanya bagian dari file yang ditampilkan. Nama rakitan dalam contoh adalah StartupEnhancement.

Konfigurasi yang disediakan oleh startup hosting

Ada dua pendekatan untuk menangani konfigurasi tergantung pada apakah Anda ingin konfigurasi startup hosting diutamakan atau konfigurasi aplikasi diutamakan:

  1. Berikan konfigurasi ke aplikasi menggunakan ConfigureAppConfiguration untuk memuat konfigurasi setelah delegasi aplikasi ConfigureAppConfiguration dijalankan. Konfigurasi startup hosting lebih diprioritaskan daripada konfigurasi aplikasi menggunakan pendekatan ini.
  2. Berikan konfigurasi ke aplikasi menggunakan UseConfiguration untuk memuat konfigurasi sebelum delegasi aplikasi ConfigureAppConfiguration dijalankan. Nilai konfigurasi aplikasi lebih diprioritaskan daripada yang disediakan oleh startup hosting menggunakan pendekatan ini.
public class ConfigurationInjection : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        Dictionary<string, string> dict;

        builder.ConfigureAppConfiguration(config =>
        {
            dict = new Dictionary<string, string>
            {
                {"ConfigurationKey1", 
                    "From IHostingStartup: Higher priority " +
                    "than the app's configuration."},
            };

            config.AddInMemoryCollection(dict);
        });

        dict = new Dictionary<string, string>
        {
            {"ConfigurationKey2", 
                "From IHostingStartup: Lower priority " +
                "than the app's configuration."},
        };

        var builtConfig = new ConfigurationBuilder()
            .AddInMemoryCollection(dict)
            .Build();

        builder.UseConfiguration(builtConfig);
    }
}

Tentukan perakitan startup hosting

Untuk startup hosting yang disediakan aplikasi pustaka kelas atau konsol, tentukan nama perakitan startup hosting dalam ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan. Variabel lingkungan adalah daftar rakitan yang dibatasi titik koma.

Hanya rakitan startup hosting yang dipindai untuk atribut .HostingStartup Untuk aplikasi sampel, HostingStartupApp, untuk menemukan startup hosting yang dijelaskan sebelumnya, variabel lingkungan diatur ke nilai berikut:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

Rakitan startup hosting juga dapat diatur menggunakan pengaturan konfigurasi host Hosting Startup Assemblies:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseSetting(
                    WebHostDefaults.HostingStartupAssembliesKey, 
                    "{ASSEMBLY1;ASSEMBLY2; ...}")
                .UseStartup<Startup>();
        });

Tempat {ASSEMBLY1;ASSEMBLY2; ...} penampung mewakili daftar rakitan yang dipisahkan titik koma.

Ketika beberapa rakitan startup hosting ada, metode mereka Configure dijalankan dalam urutan rakitan dicantumkan.

Pengaktifan

Opsi untuk menghosting aktivasi startup adalah:

  • Penyimpanan runtime: Aktivasi tidak memerlukan referensi waktu kompilasi untuk aktivasi. Aplikasi sampel menempatkan rakitan startup hosting dan file dependensi ke dalam folder, penyebaran, untuk memfasilitasi penyebaran startup hosting di lingkungan multimachine. Folder penyebaran juga menyertakan skrip PowerShell yang membuat atau memodifikasi variabel lingkungan pada sistem penyebaran untuk mengaktifkan startup hosting.
  • Referensi waktu kompilasi diperlukan untuk aktivasi

Penyimpanan runtime

Implementasi startup hosting ditempatkan di penyimpanan runtime. Referensi waktu kompilasi ke rakitan tidak diperlukan oleh aplikasi yang ditingkatkan.

Setelah startup hosting dibangun, penyimpanan runtime dibuat menggunakan file proyek manifes dan perintah penyimpanan dotnet.

dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization

Di aplikasi sampel (proyek RuntimeStore ) perintah berikut digunakan:

dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization

Agar runtime untuk menemukan penyimpanan runtime, lokasi penyimpanan runtime ditambahkan ke DOTNET_SHARED_STORE variabel lingkungan.

Memodifikasi dan menempatkan file dependensi startup hosting

Untuk mengaktifkan peningkatan tanpa referensi paket ke peningkatan, tentukan dependensi tambahan ke runtime dengan additionalDeps. additionalDeps memungkinkan Anda untuk:

  • Perluas grafik pustaka aplikasi dengan menyediakan sekumpulan file tambahan .deps.json untuk digabungkan dengan file aplikasi sendiri .deps.json saat startup.
  • Buat perakitan startup hosting dapat ditemukan dan dapat dimuat.

Pendekatan yang direkomendasikan untuk menghasilkan file dependensi tambahan adalah dengan:

  1. Jalankan dotnet publish pada file manifes penyimpanan runtime yang dirujuk di bagian sebelumnya.
  2. Hapus referensi manifes dari pustaka dan bagian runtime file yang dihasilkan .deps.json .

Dalam proyek contoh, store.manifest/1.0.0 properti dihapus dari bagian targets dan libraries :

{
  "runtimeTarget": {
    "name": ".NETCoreApp,Version=v3.0",
    "signature": ""
  },
  "compilationOptions": {},
  "targets": {
    ".NETCoreApp,Version=v3.0": {
      "store.manifest/1.0.0": {
        "dependencies": {
          "StartupDiagnostics": "1.0.0"
        },
        "runtime": {
          "store.manifest.dll": {}
        }
      },
      "StartupDiagnostics/1.0.0": {
        "runtime": {
          "lib/netcoreapp3.0/StartupDiagnostics.dll": {
            "assemblyVersion": "1.0.0.0",
            "fileVersion": "1.0.0.0"
          }
        }
      }
    }
  },
  "libraries": {
    "store.manifest/1.0.0": {
      "type": "project",
      "serviceable": false,
      "sha512": ""
    },
    "StartupDiagnostics/1.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-xrhzuNSyM5/f4ZswhooJ9dmIYLP64wMnqUJSyTKVDKDVj5T+qtzypl8JmM/aFJLLpYrf0FYpVWvGujd7/FfMEw==",
      "path": "startupdiagnostics/1.0.0",
      "hashPath": "startupdiagnostics.1.0.0.nupkg.sha512"
    }
  }
}

Tempatkan .deps.json file ke lokasi berikut:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: Lokasi ditambahkan ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.
  • {SHARED FRAMEWORK NAME}: Kerangka kerja bersama diperlukan untuk file dependensi tambahan ini.
  • {SHARED FRAMEWORK VERSION}: Versi kerangka kerja bersama minimum.
  • {ENHANCEMENT ASSEMBLY NAME}: Nama rakitan penyempurnaan.

Di aplikasi sampel (proyek RuntimeStore ), file dependensi tambahan ditempatkan ke lokasi berikut:

deployment/additionalDeps/shared/Microsoft.AspNetCore.App/3.0.0/StartupDiagnostics.deps.json

Agar runtime menemukan lokasi penyimpanan runtime, lokasi file dependensi tambahan ditambahkan ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.

Dalam aplikasi sampel (proyek RuntimeStore ), membangun penyimpanan runtime dan menghasilkan file dependensi tambahan dicapai menggunakan skrip PowerShell .

Untuk contoh cara mengatur variabel lingkungan untuk berbagai sistem operasi, lihat Menggunakan beberapa lingkungan.

Penyebaran

Untuk memfasilitasi penyebaran startup hosting di lingkungan multimachine, aplikasi sampel membuat folder penyebaran dalam output yang diterbitkan yang berisi:

  • Penyimpanan runtime startup hosting.
  • File dependensi startup hosting.
  • Skrip PowerShell yang membuat atau memodifikasi ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STORE, dan DOTNET_ADDITIONAL_DEPS untuk mendukung aktivasi startup hosting. Jalankan skrip dari prompt perintah PowerShell administratif pada sistem penyebaran.

Paket NuGet

Penyempurnaan startup hosting dapat disediakan dalam paket NuGet. Paket memiliki HostingStartup atribut . Jenis startup hosting yang disediakan oleh paket tersedia untuk aplikasi menggunakan salah satu pendekatan berikut:

  • File proyek aplikasi yang disempurnakan membuat referensi paket untuk startup hosting dalam file proyek aplikasi (referensi waktu kompilasi). Dengan referensi waktu kompilasi di tempat, perakitan startup hosting dan semua dependensinya dimasukkan ke dalam file dependensi aplikasi (.deps.json). Pendekatan ini berlaku untuk paket perakitan startup hosting yang diterbitkan ke nuget.org.
  • File dependensi startup hosting tersedia untuk aplikasi yang ditingkatkan seperti yang dijelaskan di bagian Penyimpanan runtime (tanpa referensi waktu kompilasi).

Untuk informasi selengkapnya tentang paket NuGet dan penyimpanan runtime bahasa umum, lihat topik berikut:

Folder bin proyek

Penyempurnaan startup hosting dapat disediakan oleh rakitan bin-deployed di aplikasi yang ditingkatkan. Jenis startup hosting yang disediakan oleh assembly tersedia untuk aplikasi menggunakan salah satu pendekatan berikut:

  • File proyek aplikasi yang disempurnakan membuat referensi perakitan ke startup hosting (referensi waktu kompilasi). Dengan referensi waktu kompilasi di tempat, perakitan startup hosting dan semua dependensinya dimasukkan ke dalam file dependensi aplikasi (.deps.json). Pendekatan ini berlaku ketika skenario penyebaran memanggil untuk membuat referensi waktu kompilasi ke assembly startup hosting (file.dll ) dan memindahkan assembly ke:
    • Proyek yang mengkonsumsi.
    • Lokasi yang dapat diakses oleh proyek yang mengkonsumsi.
  • File dependensi startup hosting tersedia untuk aplikasi yang ditingkatkan seperti yang dijelaskan di bagian Penyimpanan runtime (tanpa referensi waktu kompilasi).
  • Saat menargetkan .NET Framework, assembly dapat dimuat dalam konteks beban default, yang pada .NET Framework berarti bahwa assembly terletak di salah satu lokasi berikut:
    • Jalur dasar aplikasi: Folder bin tempat executable (.exe) aplikasi berada.
    • Global Assembly Cache (GAC): GAC menyimpan rakitan yang dibagikan beberapa aplikasi .NET Framework. Untuk informasi selengkapnya, lihat Cara: Menginstal rakitan ke dalam cache perakitan global dalam dokumentasi .NET Framework.

Kode Sampel

Kode sampel (cara mengunduh) menunjukkan skenario implementasi startup hosting:

  • Dua rakitan startup hosting (pustaka kelas) menetapkan sepasang pasangan kunci-nilai konfigurasi dalam memori masing-masing:
    • Paket NuGet (HostingStartupPackage)
    • Pustaka kelas (HostingStartupLibrary)
  • Startup hosting diaktifkan dari rakitan yang disebarkan penyimpanan runtime (StartupDiagnostics). Rakitan menambahkan dua middleware ke aplikasi saat startup yang memberikan informasi diagnostik tentang:
    • Layanan terdaftar
    • Alamat (skema, host, dasar jalur, jalur, string kueri)
    • Koneksi ion (IP jarak jauh, port jarak jauh, IP lokal, port lokal, sertifikat klien)
    • Header permintaan
    • Variabel lingkungan

Untuk menjalankan sampel:

Aktivasi dari paket NuGet

  1. Kompilasi paket HostingStartupPackage dengan perintah paket dotnet.

  2. Tambahkan nama rakitan paket dari HostingStartupPackage ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.

  3. Kompilasi dan jalankan aplikasi. Referensi paket ada di aplikasi yang ditingkatkan (referensi waktu kompilasi). <PropertyGroup> Dalam file proyek aplikasi menentukan output proyek paket (.. . /HostingStartupPackage/bin/Debug) sebagai sumber paket. Ini memungkinkan aplikasi untuk menggunakan paket tanpa mengunggah paket ke nuget.org. Untuk informasi selengkapnya, lihat catatan dalam file proyek HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Amati bahwa nilai kunci konfigurasi layanan yang dirender oleh halaman Indeks cocok dengan nilai yang ditetapkan oleh metode paket ServiceKeyInjection.Configure .

Jika Anda membuat perubahan pada proyek HostingStartupPackage dan mengkombinasi ulang, hapus cache paket NuGet lokal untuk memastikan bahwa HostingStartupApp menerima paket yang diperbarui dan bukan paket kedaluarsa dari cache lokal. Untuk menghapus cache NuGet lokal, jalankan perintah lokal nuget dotnet berikut:

dotnet nuget locals all --clear

Aktivasi dari pustaka kelas

  1. Kompilasi pustaka kelas HostingStartupLibrary dengan perintah build dotnet.

  2. Tambahkan nama rakitan pustaka kelas HostingStartupLibrary ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.

  3. bin-deploy rakitan pustaka kelas ke aplikasi dengan menyalin file HostingStartupLibrary.dll dari output yang dikompilasi pustaka kelas ke folder bin/Debug aplikasi.

  4. Kompilasi dan jalankan aplikasi. Dalam <ItemGroup> file proyek aplikasi mereferensikan rakitan pustaka kelas (.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll) (referensi waktu kompilasi). Untuk informasi selengkapnya, lihat catatan dalam file proyek HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp3.0\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion> 
      </Reference>
    </ItemGroup>
    
  5. Amati bahwa nilai kunci konfigurasi layanan yang dirender oleh halaman Indeks cocok dengan nilai yang ditetapkan oleh metode pustaka ServiceKeyInjection.Configure kelas.

Aktivasi dari rakitan yang disebarkan penyimpanan runtime

  1. Proyek StartupDiagnosticsmenggunakan PowerShell untuk mengubah filenya StartupDiagnostics.deps.json . PowerShell diinstal secara default pada Windows yang dimulai dengan Windows 7 SP1 dan Windows Server 2008 R2 SP1. Untuk mendapatkan PowerShell di platform lain, lihat Menginstal berbagai versi PowerShell.
  2. Jalankan skrip build.ps1 di folder RuntimeStore . Skrip:
    • StartupDiagnostics Menghasilkan paket di folder obj\packages.
    • Menghasilkan penyimpanan runtime untuk StartupDiagnostics di folder penyimpanan . dotnet store Perintah dalam skrip menggunakan win7-x64pengidentifikasi runtime (RID) untuk startup hosting yang disebarkan ke Windows. Saat menyediakan startup hosting untuk runtime yang berbeda, ganti RID yang benar pada baris 37 skrip. Penyimpanan runtime untuk StartupDiagnostics nantinya akan dipindahkan ke penyimpanan runtime pengguna atau sistem pada komputer tempat perakitan akan dikonsumsi. Lokasi penginstalan penyimpanan runtime pengguna untuk StartupDiagnostics rakitan adalah .dotnet/store/x64/netcoreapp3.0/startupdiagnostics/1.0.0/lib/netcoreapp3.0/StartupDiagnostics.dll.
    • additionalDeps Menghasilkan untuk StartupDiagnostics di folder additionalDeps. Dependensi tambahan nantinya akan dipindahkan ke dependensi tambahan pengguna atau sistem. Lokasi penginstalan dependensi tambahan pengguna StartupDiagnostics adalah .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/3.0.0/StartupDiagnostics.deps.json.
    • Tempatkan file deploy.ps1 di folder penyebaran .
  3. Jalankan skrip deploy.ps1 di folder penyebaran . Skrip menambahkan:
    • StartupDiagnostics ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.
    • Jalur dependensi startup hosting (di folder penyebaran proyek RuntimeStore) ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.
    • Jalur penyimpanan runtime (di folder penyebaran proyek RuntimeStore) ke DOTNET_SHARED_STORE variabel lingkungan.
  4. Jalankan aplikasi sampel.
  5. /services Minta titik akhir untuk melihat layanan terdaftar aplikasi. /diag Minta titik akhir untuk melihat informasi diagnostik.

IHostingStartup Implementasi (startup hosting) menambahkan penyempurnaan ke aplikasi saat startup dari rakitan eksternal. Misalnya, pustaka eksternal dapat menggunakan implementasi startup hosting untuk menyediakan penyedia konfigurasi atau layanan tambahan ke aplikasi.

Melihat atau mengunduh kode sampel (cara mengunduh)

Atribut HostingStartup

Atribut HostingStartup menunjukkan adanya perakitan startup hosting untuk diaktifkan saat runtime.

Rakitan entri atau rakitan yang berisi Startup kelas secara otomatis dipindai untuk HostingStartup atribut . Daftar rakitan untuk HostingStartup mencari atribut dimuat saat runtime dari konfigurasi di WebHostDefaults.HostingStartupAssembliesKey. Daftar rakitan yang akan dikecualikan dari penemuan dimuat dari WebHostDefaults.HostingStartupExcludeAssembliesKey. Untuk informasi selengkapnya, lihat Web Host: Hosting Startup Assemblies dan Web Host: Hosting Startup Exclude Assemblies.

Dalam contoh berikut, namespace perakitan startup hosting adalah StartupEnhancement. Kelas yang berisi kode startup hosting adalah StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Atribut HostingStartup ini biasanya terletak di file kelas implementasi perakitan IHostingStartup startup hosting.

Menemukan rakitan startup hosting yang dimuat

Untuk menemukan rakitan startup hosting yang dimuat, aktifkan pengelogan dan periksa log aplikasi. Kesalahan yang terjadi saat memuat rakitan dicatat. Rakitan startup hosting yang dimuat dicatat di tingkat Debug, dan semua kesalahan dicatat.

Menonaktifkan pemuatan otomatis rakitan startup hosting

Untuk menonaktifkan pemuatan otomatis rakitan startup hosting, gunakan salah satu pendekatan berikut:

Jika pengaturan konfigurasi host dan variabel lingkungan diatur, pengaturan host mengontrol perilaku.

Menonaktifkan rakitan startup hosting menggunakan pengaturan host atau variabel lingkungan menonaktifkan perakitan secara global dan dapat menonaktifkan beberapa karakteristik aplikasi.

Project

Buat startup hosting dengan salah satu jenis proyek berikut:

Pustaka kelas

Penyempurnaan startup hosting dapat disediakan di pustaka kelas. Pustaka berisi HostingStartup atribut.

Kode sampel mencakup Razor aplikasi Pages, HostingStartupApp, dan pustaka kelas, HostingStartupLibrary. Pustaka kelas:

  • Berisi kelas startup hosting, ServiceKeyInjection, yang mengimplementasikan IHostingStartup. ServiceKeyInjection menambahkan sepasang string layanan ke konfigurasi aplikasi menggunakan penyedia konfigurasi dalam memori (AddInMemoryCollection).
  • HostingStartup Menyertakan atribut yang mengidentifikasi namespace layanan dan kelas startup hosting.

Metode ServiceKeyInjection kelas Configure menggunakan IWebHostBuilder untuk menambahkan penyempurnaan ke aplikasi.

HostingStartupLibrary/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]

namespace HostingStartupLibrary
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromLibrary", "DEV_1111111-1111"},
                    {"ProdAccount_FromLibrary", "PROD_2222222-2222"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Halaman Indeks aplikasi membaca dan merender nilai konfigurasi untuk dua kunci yang ditetapkan oleh rakitan startup hosting pustaka kelas:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Kode sampel juga mencakup proyek paket NuGet yang menyediakan startup hosting terpisah, HostingStartupPackage. Paket ini memiliki karakteristik yang sama dari pustaka kelas yang dijelaskan sebelumnya. Paket:

  • Berisi kelas startup hosting, ServiceKeyInjection, yang mengimplementasikan IHostingStartup. ServiceKeyInjection menambahkan sepasang string layanan ke konfigurasi aplikasi.
  • HostingStartup Menyertakan atribut.

HostingStartupPackage/ServiceKeyInjection.cs:

[assembly: HostingStartup(typeof(HostingStartupPackage.ServiceKeyInjection))]

namespace HostingStartupPackage
{
    public class ServiceKeyInjection : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                var dict = new Dictionary<string, string>
                {
                    {"DevAccount_FromPackage", "DEV_3333333-3333"},
                    {"ProdAccount_FromPackage", "PROD_4444444-4444"}
                };

                config.AddInMemoryCollection(dict);
            });
        }
    }
}

Halaman Indeks aplikasi membaca dan merender nilai konfigurasi untuk dua kunci yang ditetapkan oleh rakitan startup hosting paket:

HostingStartupApp/Pages/Index.cshtml.cs:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        ServiceKey_Development_Library = config["DevAccount_FromLibrary"];
        ServiceKey_Production_Library = config["ProdAccount_FromLibrary"];
        ServiceKey_Development_Package = config["DevAccount_FromPackage"];
        ServiceKey_Production_Package = config["ProdAccount_FromPackage"];
    }

    public string ServiceKey_Development_Library { get; private set; }
    public string ServiceKey_Production_Library { get; private set; }
    public string ServiceKey_Development_Package { get; private set; }
    public string ServiceKey_Production_Package { get; private set; }

    public void OnGet()
    {
    }
}

Aplikasi konsol tanpa titik masuk

Pendekatan ini hanya tersedia untuk aplikasi .NET Core, bukan .NET Framework.

Peningkatan startup hosting dinamis yang tidak memerlukan referensi waktu kompilasi untuk aktivasi dapat disediakan di aplikasi konsol tanpa titik masuk yang berisi HostingStartup atribut. Menerbitkan aplikasi konsol menghasilkan rakitan startup hosting yang dapat dikonsumsi dari penyimpanan runtime.

Aplikasi konsol tanpa titik masuk digunakan dalam proses ini karena:

  • File dependensi diperlukan untuk menggunakan startup hosting di perakitan startup hosting. File dependensi adalah aset aplikasi yang dapat dijalankan yang diproduksi dengan menerbitkan aplikasi, bukan pustaka.
  • Pustaka tidak dapat ditambahkan langsung ke penyimpanan paket runtime, yang memerlukan proyek yang dapat dijalankan yang menargetkan runtime bersama.

Dalam pembuatan startup hosting dinamis:

  • Rakitan startup hosting dibuat dari aplikasi konsol tanpa titik masuk yang:
  • Aplikasi konsol diterbitkan untuk mendapatkan dependensi startup hosting. Konsekuensi dari penerbitan aplikasi konsol adalah bahwa dependensi yang tidak digunakan dipangkas dari file dependensi.
  • File dependensi dimodifikasi untuk mengatur lokasi runtime perakitan startup hosting.
  • Perakitan startup hosting dan file dependensinya ditempatkan ke dalam penyimpanan paket runtime. Untuk menemukan perakitan startup hosting dan file dependensinya, mereka tercantum dalam sepasang variabel lingkungan.

Aplikasi konsol mereferensikan paket Microsoft.AspNetCore.Hosting.Abstractions :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" 
                      Version="2.1.1" />
  </ItemGroup>

</Project>

Atribut HostingStartup mengidentifikasi kelas sebagai implementasi IHostingStartup untuk pemuatan dan eksekusi saat membangun IWebHost. Dalam contoh berikut, namespace adalah StartupEnhancement, dan kelasnya adalah StartupEnhancementHostingStartup:

[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]

Kelas mengimplementasikan IHostingStartup. Metode kelas Configure menggunakan IWebHostBuilder untuk menambahkan penyempurnaan ke aplikasi. IHostingStartup.Configure di rakitan startup hosting dipanggil oleh runtime sebelumnya Startup.Configure dalam kode pengguna, yang memungkinkan kode pengguna untuk menimpa konfigurasi apa pun yang disediakan oleh perakitan startup hosting.

namespace StartupEnhancement
{
    public class StartupEnhancementHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            // Use the IWebHostBuilder to add app enhancements.
        }
    }
}

Saat membangun IHostingStartup proyek, file dependensi (.deps.json) mengatur runtime lokasi perakitan ke folder bin :

"targets": {
  ".NETCoreApp,Version=v2.1": {
    "StartupEnhancement/1.0.0": {
      "dependencies": {
        "Microsoft.AspNetCore.Hosting.Abstractions": "2.1.1"
      },
      "runtime": {
        "StartupEnhancement.dll": {}
      }
    }
  }
}

Hanya bagian dari file yang ditampilkan. Nama rakitan dalam contoh adalah StartupEnhancement.

Konfigurasi yang disediakan oleh startup hosting

Ada dua pendekatan untuk menangani konfigurasi tergantung pada apakah Anda ingin konfigurasi startup hosting diutamakan atau konfigurasi aplikasi diutamakan:

  1. Berikan konfigurasi ke aplikasi menggunakan ConfigureAppConfiguration untuk memuat konfigurasi setelah delegasi aplikasi ConfigureAppConfiguration dijalankan. Konfigurasi startup hosting lebih diprioritaskan daripada konfigurasi aplikasi menggunakan pendekatan ini.
  2. Berikan konfigurasi ke aplikasi menggunakan UseConfiguration untuk memuat konfigurasi sebelum delegasi aplikasi ConfigureAppConfiguration dijalankan. Nilai konfigurasi aplikasi lebih diprioritaskan daripada yang disediakan oleh startup hosting menggunakan pendekatan ini.
public class ConfigurationInjection : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        Dictionary<string, string> dict;

        builder.ConfigureAppConfiguration(config =>
        {
            dict = new Dictionary<string, string>
            {
                {"ConfigurationKey1", 
                    "From IHostingStartup: Higher priority " +
                    "than the app's configuration."},
            };

            config.AddInMemoryCollection(dict);
        });

        dict = new Dictionary<string, string>
        {
            {"ConfigurationKey2", 
                "From IHostingStartup: Lower priority " +
                "than the app's configuration."},
        };

        var builtConfig = new ConfigurationBuilder()
            .AddInMemoryCollection(dict)
            .Build();

        builder.UseConfiguration(builtConfig);
    }
}

Tentukan perakitan startup hosting

Untuk startup hosting yang disediakan aplikasi pustaka kelas atau konsol, tentukan nama perakitan startup hosting dalam ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan. Variabel lingkungan adalah daftar rakitan yang dibatasi titik koma.

Hanya rakitan startup hosting yang dipindai untuk atribut .HostingStartup Untuk aplikasi sampel, HostingStartupApp, untuk menemukan startup hosting yang dijelaskan sebelumnya, variabel lingkungan diatur ke nilai berikut:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

Rakitan startup hosting juga dapat diatur menggunakan pengaturan konfigurasi host Hosting Startup Assemblies .

Ketika beberapa rakitan startup hosting ada, metode mereka Configure dijalankan dalam urutan rakitan dicantumkan.

Pengaktifan

Opsi untuk menghosting aktivasi startup adalah:

  • Penyimpanan runtime: Aktivasi tidak memerlukan referensi waktu kompilasi untuk aktivasi. Aplikasi sampel menempatkan rakitan startup hosting dan file dependensi ke dalam folder, penyebaran, untuk memfasilitasi penyebaran startup hosting di lingkungan multimachine. Folder penyebaran juga menyertakan skrip PowerShell yang membuat atau memodifikasi variabel lingkungan pada sistem penyebaran untuk mengaktifkan startup hosting.
  • Referensi waktu kompilasi diperlukan untuk aktivasi

Penyimpanan runtime

Implementasi startup hosting ditempatkan di penyimpanan runtime. Referensi waktu kompilasi ke rakitan tidak diperlukan oleh aplikasi yang ditingkatkan.

Setelah startup hosting dibangun, penyimpanan runtime dibuat menggunakan file proyek manifes dan perintah penyimpanan dotnet.

dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization

Di aplikasi sampel (proyek RuntimeStore ) perintah berikut digunakan:

dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization

Agar runtime untuk menemukan penyimpanan runtime, lokasi penyimpanan runtime ditambahkan ke DOTNET_SHARED_STORE variabel lingkungan.

Memodifikasi dan menempatkan file dependensi startup hosting

Untuk mengaktifkan peningkatan tanpa referensi paket ke peningkatan, tentukan dependensi tambahan ke runtime dengan additionalDeps. additionalDeps memungkinkan Anda untuk:

  • Perluas grafik pustaka aplikasi dengan menyediakan sekumpulan file tambahan .deps.json untuk digabungkan dengan file aplikasi sendiri .deps.json saat startup.
  • Buat perakitan startup hosting dapat ditemukan dan dapat dimuat.

Pendekatan yang direkomendasikan untuk menghasilkan file dependensi tambahan adalah dengan:

  1. Jalankan dotnet publish pada file manifes penyimpanan runtime yang dirujuk di bagian sebelumnya.
  2. Hapus referensi manifes dari pustaka dan bagian runtime file yang dihasilkan .deps.json .

Dalam proyek contoh, store.manifest/1.0.0 properti dihapus dari bagian targets dan libraries :

{
  "runtimeTarget": {
    "name": ".NETCoreApp,Version=v2.1",
    "signature": "4ea77c7b75ad1895ae1ea65e6ba2399010514f99"
  },
  "compilationOptions": {},
  "targets": {
    ".NETCoreApp,Version=v2.1": {
      "store.manifest/1.0.0": {
        "dependencies": {
          "StartupDiagnostics": "1.0.0"
        },
        "runtime": {
          "store.manifest.dll": {}
        }
      },
      "StartupDiagnostics/1.0.0": {
        "runtime": {
          "lib/netcoreapp2.1/StartupDiagnostics.dll": {
            "assemblyVersion": "1.0.0.0",
            "fileVersion": "1.0.0.0"
          }
        }
      }
    }
  },
  "libraries": {
    "store.manifest/1.0.0": {
      "type": "project",
      "serviceable": false,
      "sha512": ""
    },
    "StartupDiagnostics/1.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-oiQr60vBQW7+nBTmgKLSldj06WNLRTdhOZpAdEbCuapoZ+M2DJH2uQbRLvFT8EGAAv4TAKzNtcztpx5YOgBXQQ==",
      "path": "startupdiagnostics/1.0.0",
      "hashPath": "startupdiagnostics.1.0.0.nupkg.sha512"
    }
  }
}

Tempatkan .deps.json file ke lokasi berikut:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: Lokasi ditambahkan ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.
  • {SHARED FRAMEWORK NAME}: Kerangka kerja bersama diperlukan untuk file dependensi tambahan ini.
  • {SHARED FRAMEWORK VERSION}: Versi kerangka kerja bersama minimum.
  • {ENHANCEMENT ASSEMBLY NAME}: Nama rakitan penyempurnaan.

Di aplikasi sampel (proyek RuntimeStore ), file dependensi tambahan ditempatkan ke lokasi berikut:

deployment/additionalDeps/shared/Microsoft.AspNetCore.App/2.1.0/StartupDiagnostics.deps.json

Agar runtime menemukan lokasi penyimpanan runtime, lokasi file dependensi tambahan ditambahkan ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.

Dalam aplikasi sampel (proyek RuntimeStore ), membangun penyimpanan runtime dan menghasilkan file dependensi tambahan dicapai menggunakan skrip PowerShell .

Untuk contoh cara mengatur variabel lingkungan untuk berbagai sistem operasi, lihat Menggunakan beberapa lingkungan.

Penyebaran

Untuk memfasilitasi penyebaran startup hosting di lingkungan multimachine, aplikasi sampel membuat folder penyebaran dalam output yang diterbitkan yang berisi:

  • Penyimpanan runtime startup hosting.
  • File dependensi startup hosting.
  • Skrip PowerShell yang membuat atau memodifikasi ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STORE, dan DOTNET_ADDITIONAL_DEPS untuk mendukung aktivasi startup hosting. Jalankan skrip dari prompt perintah PowerShell administratif pada sistem penyebaran.

Paket NuGet

Penyempurnaan startup hosting dapat disediakan dalam paket NuGet. Paket memiliki HostingStartup atribut . Jenis startup hosting yang disediakan oleh paket tersedia untuk aplikasi menggunakan salah satu pendekatan berikut:

  • File proyek aplikasi yang disempurnakan membuat referensi paket untuk startup hosting dalam file proyek aplikasi (referensi waktu kompilasi). Dengan referensi waktu kompilasi di tempat, perakitan startup hosting dan semua dependensinya dimasukkan ke dalam file dependensi aplikasi (.deps.json). Pendekatan ini berlaku untuk paket perakitan startup hosting yang diterbitkan ke nuget.org.
  • File dependensi startup hosting tersedia untuk aplikasi yang ditingkatkan seperti yang dijelaskan di bagian Penyimpanan runtime (tanpa referensi waktu kompilasi).

Untuk informasi selengkapnya tentang paket NuGet dan penyimpanan runtime bahasa umum, lihat topik berikut:

Folder bin proyek

Penyempurnaan startup hosting dapat disediakan oleh rakitan bin-deployed di aplikasi yang ditingkatkan. Jenis startup hosting yang disediakan oleh assembly tersedia untuk aplikasi menggunakan salah satu pendekatan berikut:

  • File proyek aplikasi yang disempurnakan membuat referensi perakitan ke startup hosting (referensi waktu kompilasi). Dengan referensi waktu kompilasi di tempat, perakitan startup hosting dan semua dependensinya dimasukkan ke dalam file dependensi aplikasi (.deps.json). Pendekatan ini berlaku ketika skenario penyebaran memanggil untuk membuat referensi waktu kompilasi ke assembly startup hosting (file.dll ) dan memindahkan assembly ke:
    • Proyek yang mengkonsumsi.
    • Lokasi yang dapat diakses oleh proyek yang mengkonsumsi.
  • File dependensi startup hosting tersedia untuk aplikasi yang ditingkatkan seperti yang dijelaskan di bagian Penyimpanan runtime (tanpa referensi waktu kompilasi).
  • Saat menargetkan .NET Framework, assembly dapat dimuat dalam konteks beban default, yang pada .NET Framework berarti bahwa assembly terletak di salah satu lokasi berikut:
    • Jalur dasar aplikasi: Folder bin tempat executable (.exe) aplikasi berada.
    • Global Assembly Cache (GAC): GAC menyimpan rakitan yang dibagikan beberapa aplikasi .NET Framework. Untuk informasi selengkapnya, lihat Cara: Menginstal rakitan ke dalam cache perakitan global dalam dokumentasi .NET Framework.

Kode Sampel

Kode sampel (cara mengunduh) menunjukkan skenario implementasi startup hosting:

  • Dua rakitan startup hosting (pustaka kelas) menetapkan sepasang pasangan kunci-nilai konfigurasi dalam memori masing-masing:
    • Paket NuGet (HostingStartupPackage)
    • Pustaka kelas (HostingStartupLibrary)
  • Startup hosting diaktifkan dari rakitan yang disebarkan penyimpanan runtime (StartupDiagnostics). Rakitan menambahkan dua middleware ke aplikasi saat startup yang memberikan informasi diagnostik tentang:
    • Layanan terdaftar
    • Alamat (skema, host, dasar jalur, jalur, string kueri)
    • Koneksi ion (IP jarak jauh, port jarak jauh, IP lokal, port lokal, sertifikat klien)
    • Header permintaan
    • Variabel lingkungan

Untuk menjalankan sampel:

Aktivasi dari paket NuGet

  1. Kompilasi paket HostingStartupPackage dengan perintah paket dotnet.

  2. Tambahkan nama rakitan paket dari HostingStartupPackage ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.

  3. Kompilasi dan jalankan aplikasi. Referensi paket ada di aplikasi yang ditingkatkan (referensi waktu kompilasi). <PropertyGroup> Dalam file proyek aplikasi menentukan output proyek paket (.. . /HostingStartupPackage/bin/Debug) sebagai sumber paket. Ini memungkinkan aplikasi untuk menggunakan paket tanpa mengunggah paket ke nuget.org. Untuk informasi selengkapnya, lihat catatan dalam file proyek HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Amati bahwa nilai kunci konfigurasi layanan yang dirender oleh halaman Indeks cocok dengan nilai yang ditetapkan oleh metode paket ServiceKeyInjection.Configure .

Jika Anda membuat perubahan pada proyek HostingStartupPackage dan mengkombinasi ulang, hapus cache paket NuGet lokal untuk memastikan bahwa HostingStartupApp menerima paket yang diperbarui dan bukan paket kedaluarsa dari cache lokal. Untuk menghapus cache NuGet lokal, jalankan perintah lokal nuget dotnet berikut:

dotnet nuget locals all --clear

Aktivasi dari pustaka kelas

  1. Kompilasi pustaka kelas HostingStartupLibrary dengan perintah build dotnet.

  2. Tambahkan nama rakitan pustaka kelas HostingStartupLibrary ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.

  3. bin-deploy rakitan pustaka kelas ke aplikasi dengan menyalin file HostingStartupLibrary.dll dari output yang dikompilasi pustaka kelas ke folder bin/Debug aplikasi.

  4. Kompilasi dan jalankan aplikasi. Dalam <ItemGroup> file proyek aplikasi mereferensikan rakitan pustaka kelas (.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll) (referensi waktu kompilasi). Untuk informasi selengkapnya, lihat catatan dalam file proyek HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp2.1\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion>
      </Reference>
    </ItemGroup>
    
  5. Amati bahwa nilai kunci konfigurasi layanan yang dirender oleh halaman Indeks cocok dengan nilai yang ditetapkan oleh metode pustaka ServiceKeyInjection.Configure kelas.

Aktivasi dari rakitan yang disebarkan penyimpanan runtime

  1. Proyek StartupDiagnosticsmenggunakan PowerShell untuk mengubah filenya StartupDiagnostics.deps.json . PowerShell diinstal secara default pada Windows yang dimulai dengan Windows 7 SP1 dan Windows Server 2008 R2 SP1. Untuk mendapatkan PowerShell di platform lain, lihat Menginstal berbagai versi PowerShell.
  2. Jalankan skrip build.ps1 di folder RuntimeStore . Skrip:
    • StartupDiagnostics Menghasilkan paket di folder obj\packages.
    • Menghasilkan penyimpanan runtime untuk StartupDiagnostics di folder penyimpanan . dotnet store Perintah dalam skrip menggunakan win7-x64pengidentifikasi runtime (RID) untuk startup hosting yang disebarkan ke Windows. Saat menyediakan startup hosting untuk runtime yang berbeda, ganti RID yang benar pada baris 37 skrip. Penyimpanan runtime untuk StartupDiagnostics nantinya akan dipindahkan ke penyimpanan runtime pengguna atau sistem pada komputer tempat perakitan akan dikonsumsi. Lokasi penginstalan penyimpanan runtime pengguna untuk StartupDiagnostics rakitan adalah .dotnet/store/x64/netcoreapp2.2/startupdiagnostics/1.0.0/lib/netcoreapp2.2/StartupDiagnostics.dll.
    • additionalDeps Menghasilkan untuk StartupDiagnostics di folder additionalDeps. Dependensi tambahan nantinya akan dipindahkan ke dependensi tambahan pengguna atau sistem. Lokasi penginstalan dependensi tambahan pengguna StartupDiagnostics adalah .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/2.2.0/StartupDiagnostics.deps.json.
    • Tempatkan file deploy.ps1 di folder penyebaran .
  3. Jalankan skrip deploy.ps1 di folder penyebaran . Skrip menambahkan:
    • StartupDiagnostics ke ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variabel lingkungan.
    • Jalur dependensi startup hosting (di folder penyebaran proyek RuntimeStore) ke DOTNET_ADDITIONAL_DEPS variabel lingkungan.
    • Jalur penyimpanan runtime (di folder penyebaran proyek RuntimeStore) ke DOTNET_SHARED_STORE variabel lingkungan.
  4. Jalankan aplikasi sampel.
  5. /services Minta titik akhir untuk melihat layanan terdaftar aplikasi. /diag Minta titik akhir untuk melihat informasi diagnostik.