Dela via


Använd värdmiljöstartsammanställningar i ASP.NET Core

Note

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Warning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Important

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

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Pavel Krymets

En IHostingStartup (värdbaserad startup) implementering lägger till förbättringar i en app vid programstart från en extern samling. Ett externt bibliotek kan till exempel använda en host-startup-implementering för att tillhandahålla ytterligare konfigurationsleverantörer eller tjänster till en app.

Visa eller ladda ned exempelkod (hur du laddar ned)

HostingStartup-attribut

Ett HostingStartup-attribut anger förekomsten av en värdmiljö-startmontering som ska aktiveras vid körning.

Inmatningssammansättningen eller sammansättningen med Startup klassen genomsöks automatiskt efter attributet HostingStartup. Listan över sammansättningar i vilka HostingStartup attribut ska sökas läses in vid körning från konfigurationen i WebHostDefaults.HostingStartupAssembliesKey. Listan över sammansättningar som ska undantas från identifiering läses in från WebHostDefaults.HostingStartupExcludeAssembliesKey.

I följande exempel är namnområdet för värdsammansättningen av startprogrammet StartupEnhancement. Klassen som innehåller värdstartkoden är StartupEnhancementHostingStartup:

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

Attributet HostingStartup finns vanligtvis i implementeringsklassfilen IHostingStartup för värdstartsammanställningen.

Identifiera inlästa startsammansättningar för värd

Om du vill identifiera inlästa startsammansättningar för värdtjänster aktiverar du loggning och kontrollerar appens loggar. Fel som uppstår vid inläsning av sammansättningar loggas. Inlästa värdstartssammansättningar loggas på felsökningsnivå och alla fel loggas.

Inaktivera automatisk inläsning av värdstartssammansättningar

Om du vill inaktivera automatisk inläsning av värdstartssammansättningar använder du någon av följande metoder:

  • Om du vill förhindra att alla värdstartsammansättningar läses in anger du något av följande till true eller 1:

    • Förhindra konfigurationsinställning för värd för värdstart:

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

  • Om du vill förhindra att specifika startsammansättningar för värdtjänster läses in, ställ in något av följande på en semikolonavgränsad sträng över startsammansättningar som ska uteslutas vid start:

    • Inställningen för värdkonfiguration Exclude Assemblies vid startup:

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

      Platshållaren {ASSEMBLY1;ASSEMBLY2; ...} representerar den semikolonavgränsade listan över sammansättningar.

    • ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES miljövariabel.

Om både värdkonfigurationsinställningen och miljövariabeln anges styr värdinställningen beteendet.

Om värdstartssammansättningar inaktiveras med hjälp av värdinställningen eller miljövariabeln inaktiveras sammansättningen globalt och kan inaktivera flera egenskaper för en app.

Project

Skapa ett webbhotellsföretag med någon av följande projekttyper:

Klassbibliotek

En startförbättring för värd kan tillhandahållas i ett klassbibliotek. Biblioteket innehåller ett HostingStartup attribut.

Exempelkoden innehåller en Razor Pages-app, HostingStartupApp och ett klassbibliotek, HostingStartupLibrary. Klassbiblioteket:

  • Innehåller en värdstartsklass, ServiceKeyInjection, som implementerar IHostingStartup. ServiceKeyInjection lägger till ett par tjänststrängar i appens konfiguration med hjälp av den minnesinterna konfigurationsprovidern (AddInMemoryCollection).
  • Innehåller ett HostingStartup attribut som identifierar värdstartens namnrymd och klass.

Klassens ServiceKeyInjectionConfigure metod använder en IWebHostBuilder för att lägga till förbättringar i en app.

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);
            });
        }
    }
}

Appens indexsida läser och återger konfigurationsvärdena för de två nycklar som angetts av klassbibliotekets värdstartssammansättning:

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()
    {
    }
}

Exempelkoden innehåller också ett NuGet-paketprojekt som tillhandahåller en separat värdstart, HostingStartupPackage. Paketet har samma egenskaper som klassbiblioteket som beskrevs tidigare. Paketet:

  • Innehåller en värdstartsklass, ServiceKeyInjection, som implementerar IHostingStartup. ServiceKeyInjection lägger till ett par tjänststrängar i appens konfiguration.
  • Innehåller ett HostingStartup attribut.

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);
            });
        }
    }
}

Appens indexsida läser och återger konfigurationsvärdena för de två nycklar som anges av paketets värdstartssammansättning:

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()
    {
    }
}

Konsolapp utan startpunkt

Den här metoden är endast tillgänglig för .NET-appar, inte .NET Framework.

En dynamisk startförbättring som inte kräver en kompileringstidsreferens för aktivering kan tillhandahållas i en konsolapp utan en startpunkt som innehåller ett HostingStartup attribut. När du publicerar konsolappen skapas en värdbaserad startsammansättning som kan användas från körningsarkivet.

En konsolapp utan startpunkt används i den här processen eftersom:

  • En fil med beroenden krävs för att använda värdstartkomponenten i värdstartssammansättningen. En beroendefil är en körbar apptillgång som skapas genom att publicera en app, inte ett bibliotek.
  • Det går inte att lägga till ett bibliotek direkt i runtime-paketarkivet, vilket kräver ett körbart projekt som riktar sig mot den delade körningen.

Vid skapandet av en dynamisk värdtjänst-startup

  • En värd-startsammansättning skapas från konsolappen utan en startpunkt som:
    • Innehåller en klass som innehåller implementeringen IHostingStartup .
    • Innehåller ett HostingStartup-attribut för att identifiera implementeringsklassen IHostingStartup .
  • Konsolappen publiceras för att hämta värdmiljöns beroenden. En följd av att du publicerar konsolappen är att oanvända beroenden trimmas från beroendefilen.
  • Beroendefilen uppdateras för att ange körplatsen för den värdstartade assemblyn.
  • Värdstartförsamlingen och dess beroendefil placeras i runtime-paketlagringen. För att identifiera värdstartssammansättningen och dess beroendefil visas de i ett par miljövariabler.

Konsolappen refererar till paketet 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>

Ett HostingStartup-attribut identifierar en klass som en implementering av IHostingStartup för inläsning och körning när du skapar IWebHost. I följande exempel är StartupEnhancementnamnområdet , och klassen är StartupEnhancementHostingStartup:

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

En klass implementerar IHostingStartup. Klassens Configure metod använder en IWebHostBuilder för att lägga till förbättringar i en app. IHostingStartup.Configure i värdstartssammansättningen anropas av körningen före Startup.Configure i användarkoden, vilket gör att användarkod kan skriva över alla konfigurationer som tillhandahålls av värdstartssammansättningen.

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

När du skapar ett IHostingStartup projekt anger .deps.json beroendefilen (runtime) platsen för sammansättningen till mappen bin:

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

Endast en del av filen visas. Sammansättningsnamnet i exemplet är StartupEnhancement.

Konfiguration som tillhandahålls av värdstarten

Det finns två sätt att hantera konfigurationen beroende på om du vill att värdstartens konfiguration ska ha företräde eller om appens konfiguration ska ha företräde:

  1. Ange konfiguration till appen med hjälp av ConfigureAppConfiguration för att läsa in konfigurationen efter att appens ConfigureAppConfiguration-delegater har exekverats. Att vara värd för startkonfigurationen prioriteras framför appens konfiguration med den här metoden.
  2. Ange konfiguration för appen genom UseConfiguration för att ladda konfigurationen innan appens ConfigureAppConfiguration delegeringar körs. Appens konfigurationsvärden har företräde framför de som tillhandahålls av värduppstarten med denna metod.
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);
    }
}

Ange värdstartssammansättningen

För antingen en klassbiblioteks- eller konsolapp som tillhandahålls som värdstart anger du namnet på värdstartssammansättningen i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln. Miljövariabeln är en semikolonavgränsad lista över sammansättningar.

Endast värdstartsammansättningar genomsöks efter attributet HostingStartup. För exempelappen HostingStartupApp, för att identifiera de värdstarter som beskrevs tidigare, anges miljövariabeln till följande värde:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

En värdstartsammansättning kan även konfigureras med värdinställningen Värdstartsammansättningar.

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

Platshållaren {ASSEMBLY1;ASSEMBLY2; ...} representerar den semikolonavgränsade listan över sammansättningar.

När det finns flera startsammansättningar för värdar körs deras Configure metoder i den ordning som sammansättningarna visas.

Activation

Alternativ för att vara värd för startaktivering är:

  • Körningsarkiv: Aktivering kräver ingen kompileringstidreferens för aktivering. Exempelappen placerar värdstartssammansättningen och beroendefilerna i en mapp, distribution, för att underlätta distributionen av värdstarten i en multimachine-miljö. Distributionsmappen innehåller också ett PowerShell-skript som skapar eller ändrar miljövariabler i distributionssystemet för att aktivera värdstarten.
  • Kompileringstidsreferens krävs för aktivering

Körningstidslagring

Implementeringen av hosting-startup placeras i runtime-lager. En kompileringstidsreferens till sammansättningen krävs inte av den förbättrade appen.

När värdstarten har skapats genereras ett körningslager med hjälp av manifestprojektfilen och kommandot dotnet store .

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

I exempelappen (RuntimeStore-projektet ) används följande kommando:

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

För att körmiljön ska upptäcka körningsarkivet tillfogas platsen för körningsarkivet till DOTNET_SHARED_STORE-miljövariabeln.

Ändra och placera värdföretagets beroendefil

Om du vill aktivera förbättringen utan en paketreferens till förbättringen anger du ytterligare beroenden till körningen med additionalDeps. additionalDeps gör att du kan:

  • Utöka appens biblioteksgraf genom att tillhandahålla en uppsättning ytterligare .deps.json filer som ska sammanfogas med appens egen .deps.json fil vid start.
  • Gör värdstartssammansättningen identifierbar och läsbar.

Den rekommenderade metoden för att generera ytterligare beroenden är att:

  1. Kör dotnet publish på manifestfilen för körningstidens lagring som omnämndes i föregående avsnitt.
  2. Ta bort manifestreferensen från biblioteken och runtime-avsnittet i den resulterande .deps.json-filen.

I exempelprojektet tas egenskapen store.manifest/1.0.0 bort från targets avsnittet och 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"
    }
  }
}

Placera .deps.json filen på följande plats:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: Plats som lagts till i DOTNET_ADDITIONAL_DEPS miljövariabeln.
  • {SHARED FRAMEWORK NAME}: Delat ramverk som krävs för den här ytterligare beroendefilen.
  • {SHARED FRAMEWORK VERSION}: Lägsta version av delat ramverk.
  • {ENHANCEMENT ASSEMBLY NAME}: Förbättringens sammansättningsnamn.

I exempelappen (RuntimeStore-projektet ) placeras den ytterligare beroendefilen på följande plats:

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

För att runtime ska kunna upptäcka platsen för runtime-lagringen läggs platsen för den ytterligare beroendefilen till i DOTNET_ADDITIONAL_DEPS miljövariabeln.

Note

Miljövariabeln DOTNET_ADDITIONAL_DEPS fungerar bara med ramverksberoende program. Den här miljövariabeln ignoreras för fristående program.

I exempelapplikationen (RuntimeStore-projektet) byggs körningsarkivet och den ytterligare beroendefilen genereras med hjälp av ett PowerShell-skript.

Exempel på hur du anger miljövariabler för olika operativsystem finns i Använda flera miljöer.

Deployment

För att underlätta distributionen av en värdtjänst i en multimaskinmiljö skapar exempelapplikationen en distributionsmapp i de publicerade utdata som innehåller:

  • Lagringsplats för värdmiljöns startkörning.
  • Filen med beroenden för värdstart.
  • Ett PowerShell-skript som skapar eller ändrar ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STOREoch DOTNET_ADDITIONAL_DEPS som stöder aktivering av värdstarten. Kör skriptet från en administrativ PowerShell-kommandotolk i distributionssystemet.

NuGet-paket

En förbättring för en hosting-startup kan tillhandahållas i ett NuGet-paket. Paketet har ett HostingStartup attribut. Typer av värdstart som tillhandahålls av paketet görs tillgängliga för appen genom någon av följande metoder:

  • Den förbättrade appens projektfil innefattar en paketreferens för startprogrammets uppstart i värdprojektet (en kompileringstidsreferens). Med kompileringstidsreferensen på plats införlivas värdstartssammansättningen och alla dess beroenden i appens beroendefil (.deps.json). Den här metoden gäller för ett uppstartspaket för hosting som publicerats till nuget.org.
  • Värdföretagets beroendefil görs tillgänglig för den förbättrade appen enligt beskrivningen i avsnittet Runtime Store (utan en kompileringsreferens).

Mer information om NuGet-paket och runtime store finns i följande avsnitt:

Mapp för projektlager

En värdförbättring för start kan tillhandahållas av en bin-distribuerad sammansättning i den förbättrade appen. Typer av värdkonfiguration som tillhandahålls av assemblaget görs tillgängliga för appen med någon av följande metoder:

  • Den förbättrade appens projektfil gör en assemblingsreferens till värdprogramstarten (en referens vid kompileringstid). Med kompileringstidsreferensen på plats införlivas värdstartssammansättningen och alla dess beroenden i appens beroendefil (.deps.json). Den här metoden gäller när distributionsscenariot kräver att man gör en kompileringstidsreferens till värdstartens assembly (.dll-filen) och flyttar assemblyn till något av följande:
    • Det tidskrävande projektet.
    • En plats som är åtkomstbar för det konsumerande projektet.
  • Värdföretagets beroendefil görs tillgänglig för den förbättrade appen enligt beskrivningen i avsnittet Runtime Store (utan en kompileringsreferens).
  • När du riktar in dig på .NET Framework kan sammansättningen läsas in i standardinläsningskontexten, vilket i .NET Framework innebär att sammansättningen finns på någon av följande platser:

Exempelkod

Exempelkoden (hur du laddar ned) visar hur du hanterar scenarier för startimplementering:

  • Två värdstartssammansättningar (klassbibliotek) anger ett par nyckel/värde-par för minnesintern konfiguration:
    • NuGet-paket (HostingStartupPackage)
    • Klassbibliotek (HostingStartupLibrary)
  • En hosting-startup aktiveras från ett körbutik-distribuerat bibliotek (StartupDiagnostics). Sammansättningen lägger till två mellanprogram i appen vid start som ger diagnostikinformation om:
    • Registrerade tjänster
    • Adress (schema, värd, sökvägsbas, sökväg, frågesträng)
    • Anslutning (fjärr-IP, fjärrport, lokal IP, lokal port, klientcertifikat)
    • Förfrågningsrubriker
    • Miljövariabler

Så här kör du exemplet:

Aktivering från ett NuGet-paket

  1. Kompilera HostingStartupPackage-paketet med kommandot dotnet pack .

  2. Lägg till paketets sammansättningsnamn för HostingStartupPackage i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln.

  3. Kompilera och kör appen. En paketreferens finns i den förbättrade appen (en kompileringsreferens). A <PropertyGroup> i appens projektfil anger paketprojektets utdata (.. /HostingStartupPackage/bin/Debug) som paketkälla. På så sätt kan appen använda paketet utan att ladda upp paketet till nuget.org. Mer information finns i anteckningarna i Projektfilen för HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Observera att värdena för tjänstkonfigurationsnyckeln som återges av sidan Index matchar de värden som anges av paketets ServiceKeyInjection.Configure metod.

Om du gör ändringar i HostingStartupPackage-projektet och kompilerar det igen rensar du de lokala NuGet-paketcacheminnena för att säkerställa att HostingStartupApp tar emot det uppdaterade paketet och inte ett inaktuellt paket från den lokala cachen. Om du vill rensa de lokala NuGet-cacheminnena kör du följande dotnet nuget locals-kommando :

dotnet nuget locals all --clear

Aktivering från ett klassbibliotek

  1. Kompilera klassbiblioteket HostingStartupLibrary med kommandot dotnet build .

  2. Lägg till klassbibliotekets sammansättningsnamn HostingStartupLibrary i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln.

  3. Bin-distribuera klassbibliotekets assembly till appen genom att kopiera filen HostingStartupLibrary.dll från klassbibliotekets kompilerade utdata till appens mapp bin/Debug.

  4. Kompilera och kör appen. En <ItemGroup> i appens projektfil refererar till klassbibliotekets sammansättning (.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll) (en kompileringstidsreferens). Mer information finns i anteckningarna i Projektfilen för HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp3.0\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion> 
      </Reference>
    </ItemGroup>
    
  5. Observera att värdena för tjänstkonfigurationsnyckeln som återges av sidan Index matchar de värden som anges av klassbibliotekets ServiceKeyInjection.Configure metod.

Aktivering från en runtime store-distribuerad assembly

  1. StartupDiagnostics-projektet använder PowerShell för att ändra filenStartupDiagnostics.deps.json. PowerShell installeras som standard i Windows från och med Windows 7 SP1 och Windows Server 2008 R2 SP1. Information om hur du hämtar PowerShell på andra plattformar finns i Installera olika versioner av PowerShell.
  2. Kör build.ps1 skriptet i mappen RuntimeStore . Skriptet:
    • Genererar StartupDiagnostics paketet i mappen obj\packages .
    • Genererar körningsarkivet för StartupDiagnostics i store-mappen . Kommandot dotnet store i skriptet använder win7-x64körningsidentifieraren (RID) för en värdstart som distribueras till Windows. När du tillhandahåller hostingstartup för en annan körtid, ersätt det korrekta RID på rad 37 i skriptet. Körningsarkivet för StartupDiagnostics skulle senare flyttas till användarens eller systemets körningsarkiv på den dator där assembly kommer att användas. Installationsplatsen för användarens runtime-lagring StartupDiagnostics för assemblyn är .dotnet/store/x64/netcoreapp3.0/startupdiagnostics/1.0.0/lib/netcoreapp3.0/StartupDiagnostics.dll.
    • Genererar additionalDeps för StartupDiagnostics i mappen additionalDeps . De ytterligare beroendena skulle senare flyttas till användarens eller systemets ytterligare beroenden. Installationsplatsen för användarens StartupDiagnostics ytterligare beroenden är .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/3.0.0/StartupDiagnostics.deps.json.
    • Placerar filen deploy.ps1 i distributionsmappen.
  3. Kör deploy.ps1 skriptet i deploy-mappen. Skriptet lägger till:
    • StartupDiagnostics till ASPNETCORE_HOSTINGSTARTUPASSEMBLIES-miljövariabeln.
    • Sökvägen för värdstartsberoenden (i distributionsmappen för RuntimeStore-projektet) till DOTNET_ADDITIONAL_DEPS miljövariabeln.
    • Sökvägen för körningstidens lagringsplats (i distributionsmappen för RuntimeStore-projektet) till miljövariabeln DOTNET_SHARED_STORE.
  4. Kör exempelappen.
  5. Anropa /services-slutpunkten för att se appens registrerade tjänster. Begär /diag-slutpunkten för att se diagnostikinformationen.

En IHostingStartup (värdbaserad startup) implementering lägger till förbättringar i en app vid programstart från en extern samling. Ett externt bibliotek kan till exempel använda en host-startup-implementering för att tillhandahålla ytterligare konfigurationsleverantörer eller tjänster till en app.

Visa eller ladda ned exempelkod (hur du laddar ned)

HostingStartup-attribut

Ett HostingStartup-attribut anger förekomsten av en värdmiljö-startmontering som ska aktiveras vid körning.

Inmatningssammansättningen eller sammansättningen med Startup klassen genomsöks automatiskt efter attributet HostingStartup. Listan över sammansättningar i vilka HostingStartup attribut ska sökas läses in vid körning från konfigurationen i WebHostDefaults.HostingStartupAssembliesKey. Listan över sammansättningar som ska undantas från identifiering läses in från WebHostDefaults.HostingStartupExcludeAssembliesKey. Mer information finns i Web Host: Hosting Startup Assemblies och Web Host: Hosting Startup Exclude Assemblies.

I följande exempel är namnområdet för värdsammansättningen av startprogrammet StartupEnhancement. Klassen som innehåller värdstartkoden är StartupEnhancementHostingStartup:

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

Attributet HostingStartup finns vanligtvis i implementeringsklassfilen IHostingStartup för värdstartsammanställningen.

Identifiera inlästa startsammansättningar för värd

Om du vill identifiera inlästa startsammansättningar för värdtjänster aktiverar du loggning och kontrollerar appens loggar. Fel som uppstår vid inläsning av sammansättningar loggas. Inlästa värdstartssammansättningar loggas på felsökningsnivå och alla fel loggas.

Inaktivera automatisk inläsning av värdstartssammansättningar

Om du vill inaktivera automatisk inläsning av värdstartssammansättningar använder du någon av följande metoder:

Om både värdkonfigurationsinställningen och miljövariabeln anges styr värdinställningen beteendet.

Om värdstartssammansättningar inaktiveras med hjälp av värdinställningen eller miljövariabeln inaktiveras sammansättningen globalt och kan inaktivera flera egenskaper för en app.

Project

Skapa ett webbhotellsföretag med någon av följande projekttyper:

Klassbibliotek

En startförbättring för värd kan tillhandahållas i ett klassbibliotek. Biblioteket innehåller ett HostingStartup attribut.

Exempelkoden innehåller en Razor Pages-app, HostingStartupApp och ett klassbibliotek, HostingStartupLibrary. Klassbiblioteket:

  • Innehåller en värdstartsklass, ServiceKeyInjection, som implementerar IHostingStartup. ServiceKeyInjection lägger till ett par tjänststrängar i appens konfiguration med hjälp av den minnesinterna konfigurationsprovidern (AddInMemoryCollection).
  • Innehåller ett HostingStartup attribut som identifierar värdstartens namnrymd och klass.

Klassens ServiceKeyInjectionConfigure metod använder en IWebHostBuilder för att lägga till förbättringar i en app.

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);
            });
        }
    }
}

Appens indexsida läser och återger konfigurationsvärdena för de två nycklar som angetts av klassbibliotekets värdstartssammansättning:

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()
    {
    }
}

Exempelkoden innehåller också ett NuGet-paketprojekt som tillhandahåller en separat värdstart, HostingStartupPackage. Paketet har samma egenskaper som klassbiblioteket som beskrevs tidigare. Paketet:

  • Innehåller en värdstartsklass, ServiceKeyInjection, som implementerar IHostingStartup. ServiceKeyInjection lägger till ett par tjänststrängar i appens konfiguration.
  • Innehåller ett HostingStartup attribut.

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);
            });
        }
    }
}

Appens indexsida läser och återger konfigurationsvärdena för de två nycklar som anges av paketets värdstartssammansättning:

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()
    {
    }
}

Konsolapp utan startpunkt

Den här metoden är endast tillgänglig för .NET-appar, inte .NET Framework.

En dynamisk startförbättring som inte kräver en kompileringstidsreferens för aktivering kan tillhandahållas i en konsolapp utan en startpunkt som innehåller ett HostingStartup attribut. När du publicerar konsolappen skapas en värdbaserad startsammansättning som kan användas från körningsarkivet.

En konsolapp utan startpunkt används i den här processen eftersom:

  • En fil med beroenden krävs för att använda värdstartkomponenten i värdstartssammansättningen. En beroendefil är en körbar apptillgång som skapas genom att publicera en app, inte ett bibliotek.
  • Det går inte att lägga till ett bibliotek direkt i runtime-paketarkivet, vilket kräver ett körbart projekt som riktar sig mot den delade körningen.

Vid skapandet av en dynamisk värdtjänst-startup

  • En värd-startsammansättning skapas från konsolappen utan en startpunkt som:
    • Innehåller en klass som innehåller implementeringen IHostingStartup .
    • Innehåller ett HostingStartup-attribut för att identifiera implementeringsklassen IHostingStartup .
  • Konsolappen publiceras för att hämta värdmiljöns beroenden. En följd av att du publicerar konsolappen är att oanvända beroenden trimmas från beroendefilen.
  • Beroendefilen uppdateras för att ange körplatsen för den värdstartade assemblyn.
  • Värdstartförsamlingen och dess beroendefil placeras i runtime-paketlagringen. För att identifiera värdstartssammansättningen och dess beroendefil visas de i ett par miljövariabler.

Konsolappen refererar till paketet 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>

Ett HostingStartup-attribut identifierar en klass som en implementering av IHostingStartup för inläsning och körning när du skapar IWebHost. I följande exempel är StartupEnhancementnamnområdet , och klassen är StartupEnhancementHostingStartup:

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

En klass implementerar IHostingStartup. Klassens Configure metod använder en IWebHostBuilder för att lägga till förbättringar i en app. IHostingStartup.Configure i värdstartssammansättningen anropas av körningen före Startup.Configure i användarkoden, vilket gör att användarkod kan skriva över alla konfigurationer som tillhandahålls av värdstartssammansättningen.

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

När du skapar ett IHostingStartup projekt anger .deps.json beroendefilen (runtime) platsen för sammansättningen till mappen bin:

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

Endast en del av filen visas. Sammansättningsnamnet i exemplet är StartupEnhancement.

Konfiguration som tillhandahålls av värdstarten

Det finns två sätt att hantera konfigurationen beroende på om du vill att värdstartens konfiguration ska ha företräde eller om appens konfiguration ska ha företräde:

  1. Ange konfiguration till appen med hjälp av ConfigureAppConfiguration för att läsa in konfigurationen efter att appens ConfigureAppConfiguration-delegater har exekverats. Att vara värd för startkonfigurationen prioriteras framför appens konfiguration med den här metoden.
  2. Ange konfiguration för appen genom UseConfiguration för att ladda konfigurationen innan appens ConfigureAppConfiguration delegeringar körs. Appens konfigurationsvärden har företräde framför de som tillhandahålls av värduppstarten med denna metod.
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);
    }
}

Ange värdstartssammansättningen

För antingen en klassbiblioteks- eller konsolapp som tillhandahålls som värdstart anger du namnet på värdstartssammansättningen i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln. Miljövariabeln är en semikolonavgränsad lista över sammansättningar.

Endast värdstartsammansättningar genomsöks efter attributet HostingStartup. För exempelappen HostingStartupApp, för att identifiera de värdstarter som beskrevs tidigare, anges miljövariabeln till följande värde:

HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics

En "hosting startup assembly" kan också konfigureras med hjälp av värdkonfigurationen för "Hosting Startup Assemblies".

När det finns flera startsammansättningar för värdar körs deras Configure metoder i den ordning som sammansättningarna visas.

Activation

Alternativ för att vara värd för startaktivering är:

  • Körningsarkiv: Aktivering kräver ingen kompileringstidreferens för aktivering. Exempelappen placerar värdstartssammansättningen och beroendefilerna i en mapp, distribution, för att underlätta distributionen av värdstarten i en multimachine-miljö. Distributionsmappen innehåller också ett PowerShell-skript som skapar eller ändrar miljövariabler i distributionssystemet för att aktivera värdstarten.
  • Kompileringstidsreferens krävs för aktivering

Körningstidslagring

Implementeringen av hosting-startup placeras i runtime-lager. En kompileringstidsreferens till sammansättningen krävs inte av den förbättrade appen.

När värdstarten har skapats genereras ett körningslager med hjälp av manifestprojektfilen och kommandot dotnet store .

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

I exempelappen (RuntimeStore-projektet ) används följande kommando:

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

För att körmiljön ska upptäcka körningsarkivet tillfogas platsen för körningsarkivet till DOTNET_SHARED_STORE-miljövariabeln.

Ändra och placera värdföretagets beroendefil

Om du vill aktivera förbättringen utan en paketreferens till förbättringen anger du ytterligare beroenden till körningen med additionalDeps. additionalDeps gör att du kan:

  • Utöka appens biblioteksgraf genom att tillhandahålla en uppsättning ytterligare .deps.json filer som ska sammanfogas med appens egen .deps.json fil vid start.
  • Gör värdstartssammansättningen identifierbar och läsbar.

Den rekommenderade metoden för att generera ytterligare beroenden är att:

  1. Kör dotnet publish på manifestfilen för körningstidens lagring som omnämndes i föregående avsnitt.
  2. Ta bort manifestreferensen från biblioteken och runtime-avsnittet i den resulterande .deps.json-filen.

I exempelprojektet tas egenskapen store.manifest/1.0.0 bort från targets avsnittet och 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"
    }
  }
}

Placera .deps.json filen på följande plats:

{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
  • {ADDITIONAL DEPENDENCIES PATH}: Plats som lagts till i DOTNET_ADDITIONAL_DEPS miljövariabeln.
  • {SHARED FRAMEWORK NAME}: Delat ramverk som krävs för den här ytterligare beroendefilen.
  • {SHARED FRAMEWORK VERSION}: Lägsta version av delat ramverk.
  • {ENHANCEMENT ASSEMBLY NAME}: Förbättringens sammansättningsnamn.

I exempelappen (RuntimeStore-projektet ) placeras den ytterligare beroendefilen på följande plats:

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

För att runtime ska kunna upptäcka platsen för runtime-lagringen läggs platsen för den ytterligare beroendefilen till i DOTNET_ADDITIONAL_DEPS miljövariabeln.

Note

Miljövariabeln DOTNET_ADDITIONAL_DEPS fungerar bara med ramverksberoende program. Den här miljövariabeln ignoreras för fristående program.

I exempelapplikationen (RuntimeStore-projektet) byggs körningsarkivet och den ytterligare beroendefilen genereras med hjälp av ett PowerShell-skript.

Exempel på hur du anger miljövariabler för olika operativsystem finns i Använda flera miljöer.

Deployment

För att underlätta distributionen av en värdtjänst i en multimaskinmiljö skapar exempelapplikationen en distributionsmapp i de publicerade utdata som innehåller:

  • Lagringsplats för värdmiljöns startkörning.
  • Filen med beroenden för värdstart.
  • Ett PowerShell-skript som skapar eller ändrar ASPNETCORE_HOSTINGSTARTUPASSEMBLIES, DOTNET_SHARED_STOREoch DOTNET_ADDITIONAL_DEPS som stöder aktivering av värdstarten. Kör skriptet från en administrativ PowerShell-kommandotolk i distributionssystemet.

NuGet-paket

En förbättring för en hosting-startup kan tillhandahållas i ett NuGet-paket. Paketet har ett HostingStartup attribut. Typer av värdstart som tillhandahålls av paketet görs tillgängliga för appen genom någon av följande metoder:

  • Den förbättrade appens projektfil innefattar en paketreferens för startprogrammets uppstart i värdprojektet (en kompileringstidsreferens). Med kompileringstidsreferensen på plats införlivas värdstartssammansättningen och alla dess beroenden i appens beroendefil (.deps.json). Den här metoden gäller för ett uppstartspaket för hosting som publicerats till nuget.org.
  • Värdföretagets beroendefil görs tillgänglig för den förbättrade appen enligt beskrivningen i avsnittet Runtime Store (utan en kompileringsreferens).

Mer information om NuGet-paket och runtime store finns i följande avsnitt:

Mapp för projektlager

En värdförbättring för start kan tillhandahållas av en bin-distribuerad sammansättning i den förbättrade appen. Typer av värdkonfiguration som tillhandahålls av assemblaget görs tillgängliga för appen med någon av följande metoder:

  • Den förbättrade appens projektfil gör en assemblingsreferens till värdprogramstarten (en referens vid kompileringstid). Med kompileringstidsreferensen på plats införlivas värdstartssammansättningen och alla dess beroenden i appens beroendefil (.deps.json). Den här metoden gäller när distributionsscenariot kräver att man gör en kompileringstidsreferens till värdstartens assembly (.dll-filen) och flyttar assemblyn till något av följande:
    • Det tidskrävande projektet.
    • En plats som är åtkomstbar för det konsumerande projektet.
  • Värdföretagets beroendefil görs tillgänglig för den förbättrade appen enligt beskrivningen i avsnittet Runtime Store (utan en kompileringsreferens).
  • När du riktar in dig på .NET Framework kan sammansättningen läsas in i standardinläsningskontexten, vilket i .NET Framework innebär att sammansättningen finns på någon av följande platser:

Exempelkod

Exempelkoden (hur du laddar ned) visar hur du hanterar scenarier för startimplementering:

  • Två värdstartssammansättningar (klassbibliotek) anger ett par nyckel/värde-par för minnesintern konfiguration:
    • NuGet-paket (HostingStartupPackage)
    • Klassbibliotek (HostingStartupLibrary)
  • En hosting-startup aktiveras från ett körbutik-distribuerat bibliotek (StartupDiagnostics). Sammansättningen lägger till två mellanprogram i appen vid start som ger diagnostikinformation om:
    • Registrerade tjänster
    • Adress (schema, värd, sökvägsbas, sökväg, frågesträng)
    • Anslutning (fjärr-IP, fjärrport, lokal IP, lokal port, klientcertifikat)
    • Förfrågningsrubriker
    • Miljövariabler

Så här kör du exemplet:

Aktivering från ett NuGet-paket

  1. Kompilera HostingStartupPackage-paketet med kommandot dotnet pack .

  2. Lägg till paketets sammansättningsnamn för HostingStartupPackage i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln.

  3. Kompilera och kör appen. En paketreferens finns i den förbättrade appen (en kompileringsreferens). A <PropertyGroup> i appens projektfil anger paketprojektets utdata (.. /HostingStartupPackage/bin/Debug) som paketkälla. På så sätt kan appen använda paketet utan att ladda upp paketet till nuget.org. Mer information finns i anteckningarna i Projektfilen för HostingStartupApp.

    <PropertyGroup>
      <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources>
    </PropertyGroup>
    
  4. Observera att värdena för tjänstkonfigurationsnyckeln som återges av sidan Index matchar de värden som anges av paketets ServiceKeyInjection.Configure metod.

Om du gör ändringar i HostingStartupPackage-projektet och kompilerar det igen rensar du de lokala NuGet-paketcacheminnena för att säkerställa att HostingStartupApp tar emot det uppdaterade paketet och inte ett inaktuellt paket från den lokala cachen. Om du vill rensa de lokala NuGet-cacheminnena kör du följande dotnet nuget locals-kommando :

dotnet nuget locals all --clear

Aktivering från ett klassbibliotek

  1. Kompilera klassbiblioteket HostingStartupLibrary med kommandot dotnet build .

  2. Lägg till klassbibliotekets sammansättningsnamn HostingStartupLibrary i ASPNETCORE_HOSTINGSTARTUPASSEMBLIES miljövariabeln.

  3. Bin-distribuera klassbibliotekets assembly till appen genom att kopiera filen HostingStartupLibrary.dll från klassbibliotekets kompilerade utdata till appens mapp bin/Debug.

  4. Kompilera och kör appen. En <ItemGroup> i appens projektfil refererar till klassbibliotekets sammansättning (.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll) (en kompileringstidsreferens). Mer information finns i anteckningarna i Projektfilen för HostingStartupApp.

    <ItemGroup>
      <Reference Include=".\\bin\\Debug\\netcoreapp2.1\\HostingStartupLibrary.dll">
        <HintPath>.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll</HintPath>
        <SpecificVersion>False</SpecificVersion>
      </Reference>
    </ItemGroup>
    
  5. Observera att värdena för tjänstkonfigurationsnyckeln som återges av sidan Index matchar de värden som anges av klassbibliotekets ServiceKeyInjection.Configure metod.

Aktivering från en runtime store-distribuerad assembly

  1. StartupDiagnostics-projektet använder PowerShell för att ändra filenStartupDiagnostics.deps.json. PowerShell installeras som standard i Windows från och med Windows 7 SP1 och Windows Server 2008 R2 SP1. Information om hur du hämtar PowerShell på andra plattformar finns i Installera olika versioner av PowerShell.
  2. Kör build.ps1 skriptet i mappen RuntimeStore . Skriptet:
    • Genererar StartupDiagnostics paketet i mappen obj\packages .
    • Genererar körningsarkivet för StartupDiagnostics i store-mappen . Kommandot dotnet store i skriptet använder win7-x64körningsidentifieraren (RID) för en värdstart som distribueras till Windows. När du tillhandahåller hostingstartup för en annan körtid, ersätt det korrekta RID på rad 37 i skriptet. Körningsarkivet för StartupDiagnostics skulle senare flyttas till användarens eller systemets körningsarkiv på den dator där assembly kommer att användas. Installationsplatsen för användarkörningsarkivet StartupDiagnostics för sammansättningen är .dotnet/store/x64/netcoreapp2.2/startupdiagnostics/1.0.0/lib/netcoreapp2.2/StartupDiagnostics.dll.
    • Genererar additionalDeps för StartupDiagnostics i mappen additionalDeps . De ytterligare beroendena skulle senare flyttas till användarens eller systemets ytterligare beroenden. Installationsplatsen för användarens StartupDiagnostics ytterligare beroenden är .dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/2.2.0/StartupDiagnostics.deps.json.
    • Placerar filen deploy.ps1 i distributionsmappen.
  3. Kör deploy.ps1 skriptet i deploy-mappen. Skriptet lägger till:
    • StartupDiagnostics till ASPNETCORE_HOSTINGSTARTUPASSEMBLIES-miljövariabeln.
    • Sökvägen för värdstartsberoenden (i distributionsmappen för RuntimeStore-projektet) till DOTNET_ADDITIONAL_DEPS miljövariabeln.
    • Sökvägen för körningstidens lagringsplats (i distributionsmappen för RuntimeStore-projektet) till miljövariabeln DOTNET_SHARED_STORE.
  4. Kör exempelappen.
  5. Anropa /services-slutpunkten för att se appens registrerade tjänster. Begär /diag-slutpunkten för att se diagnostikinformationen.