Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Note
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Warning
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Por Pavel Krymets
Uma IHostingStartup implementação (inicialização de hospedagem) adiciona aprimoramentos a um aplicativo na inicialização a partir de um assembly externo. Por exemplo, uma biblioteca externa pode usar uma implementação de inicialização de hospedagem para fornecer provedores de configuração ou serviços adicionais para um aplicativo.
Visualizar ou descarregar amostra de código (como descarregar)
Atributo HostingStartup
Um atributo HostingStartup indica a presença de um assembly de inicialização de hospedagem para ativar em tempo de execução.
A assembly de entrada ou a assembly que contém a classe Startup é automaticamente verificada para o atributo HostingStartup. A lista de assemblies onde procurar HostingStartup atributos é carregada em tempo de execução a partir da configuração no WebHostDefaults.HostingStartupAssembliesKey. A lista de assemblies a serem excluídos da descoberta é carregada do WebHostDefaults.HostingStartupExcludeAssembliesKey.
No exemplo a seguir, o namespace do assembly de inicialização de hospedagem é StartupEnhancement. A classe que contém o código de inicialização de hospedagem é StartupEnhancementHostingStartup:
[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]
O HostingStartup atributo normalmente está localizado no arquivo da classe de implementação do assembly de inicialização de hospedagem IHostingStartup.
Descubra assemblies de inicialização de hospedagem carregados
Para descobrir os conjuntos de inicialização de hospedagem carregados, ative o logging e verifique os logs da aplicação. Os erros que ocorrem ao carregar assemblies são registrados. Os conjuntos de inicialização de hospedagem carregados são registados ao nível de Depuração, e todos os erros são registados.
Desativar o carregamento automático de assemblies de inicialização de hospedagem
Para desativar o carregamento automático de assemblies de inicialização de hospedagem, use uma das seguintes abordagens:
Para impedir que todos os assemblies de inicialização de hospedagem sejam carregados, defina uma das seguintes opções como
trueou1:Impedir a configuração do host de inicialização de hospedagem:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseSetting( WebHostDefaults.PreventHostingStartupKey, "true") .UseStartup<Startup>(); });ASPNETCORE_PREVENTHOSTINGSTARTUPvariável de ambiente.
Para impedir que assemblies de inicialização de hospedagem específicos sejam carregados, defina uma das seguintes opções como uma cadeia de caracteres delimitada por ponto-e-vírgula de assemblies de inicialização de hospedagem a serem excluídos na inicialização:
Definição de configuração de host para Hosting Startup Exclude Assemblies.
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseSetting( WebHostDefaults.HostingStartupExcludeAssembliesKey, "{ASSEMBLY1;ASSEMBLY2; ...}") .UseStartup<Startup>(); });O marcador
{ASSEMBLY1;ASSEMBLY2; ...}representa a lista de assemblies separados por ponto-e-vírgula.ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIESvariável de ambiente.
Se a definição de configuração do host e a variável de ambiente estiverem definidas, a configuração do host controlará o comportamento.
Desativar assemblies de inicialização de hospedagem através da configuração de hospedagem ou de variáveis de ambiente desativa o assembly globalmente e pode desativar várias características de uma aplicação.
Project
Crie uma inicialização de hospedagem com um dos seguintes tipos de projeto:
Biblioteca de classes
Um aprimoramento de inicialização de hospedagem pode ser fornecido em uma biblioteca de classes. A biblioteca contém um HostingStartup atributo.
O código de exemplo inclui um Razor aplicativo Pages, HostingStartupApp, e uma biblioteca de classes, HostingStartupLibrary. A biblioteca de classes
- Contém uma classe startup de hospedagem,
ServiceKeyInjection, que implementaIHostingStartup.ServiceKeyInjectionadiciona um par de cadeias de caracteres de serviço à configuração do aplicativo usando o provedor de configuração na memória (AddInMemoryCollection). - Inclui um
HostingStartupatributo que identifica o namespace e a classe da inicialização de hospedagem.
O ServiceKeyInjection método da Configure classe usa um IWebHostBuilder para adicionar aprimoramentos a um aplicativo.
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);
});
}
}
}
A página Índice da aplicação lê e apresenta os valores de configuração para as duas chaves definidas pelo assembly de inicialização de hospedagem da biblioteca de classes.
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()
{
}
}
O código de exemplo também inclui um projeto de pacote NuGet que fornece uma inicialização de hospedagem separada, HostingStartupPackage. O pacote tem as mesmas características da biblioteca de classes descritas anteriormente. O pacote:
- Contém uma classe startup de hospedagem,
ServiceKeyInjection, que implementaIHostingStartup.ServiceKeyInjectionAdiciona um par de cadeias de caracteres de serviço à configuração do aplicativo. - Inclui um
HostingStartupatributo.
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);
});
}
}
}
A página Índice do aplicativo lê e apresenta os valores de configuração para as duas chaves definidas pelo assembly de iniciação de hospedagem do pacote.
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()
{
}
}
Aplicativo de console sem um ponto de entrada
Essa abordagem só está disponível para aplicativos .NET, não para o .NET Framework.
Uma melhoria de inicialização dinâmica de hospedagem, que não requer uma referência em tempo de compilação para ativação, pode ser fornecida num aplicativo de console sem um ponto de entrada que contenha um atributo HostingStartup. A publicação do aplicativo de console produz um assembly de inicialização de hospedagem que pode ser consumido a partir do repositório de tempo de execução.
Um aplicativo de console sem um ponto de entrada é usado nesse processo porque:
- Um arquivo de dependências é necessário para consumir a inicialização de hospedagem no assembly de inicialização de hospedagem. Um arquivo de dependências é um ativo de aplicativo executável que é produzido pela publicação de um aplicativo, não de uma biblioteca.
- Uma biblioteca não pode ser adicionada diretamente ao repositório de pacotes de tempo de execução, o que requer um projeto executável destinado ao tempo de execução compartilhado.
Na criação de uma startup de hospedagem dinâmica:
- Um conjunto de inicialização de hospedagem é criado a partir da aplicação de consola sem um ponto de entrada que:
- Inclui uma classe que contém a
IHostingStartupimplementação. - Inclui um atributo HostingStartup para identificar a classe de
IHostingStartupimplementação.
- Inclui uma classe que contém a
- A aplicação de console é publicada para obter as dependências do arranque de hospedagem. Uma consequência da publicação do aplicativo de console é que as dependências não utilizadas são cortadas do arquivo de dependências.
- O ficheiro de dependências é modificado para definir o local de execução do assembly de inicialização de hospedagem.
- O assembly de inicialização de hospedagem e seu arquivo de dependências são colocados no repositório de pacotes de tempo de execução. Para descobrir o assembly de inicialização de hospedagem e seu arquivo de dependências, eles são listados em um par de variáveis de ambiente.
O aplicativo de console faz referência ao pacote 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>
Um atributo HostingStartup identifica uma classe como uma implementação de IHostingStartup para carregamento e execução ao construir o IWebHost. No exemplo a seguir, o namespace é StartupEnhancement, e a classe é StartupEnhancementHostingStartup:
[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]
Uma classe implementa IHostingStartup. O método da Configure classe usa um IWebHostBuilder para adicionar aprimoramentos a um aplicativo.
IHostingStartup.Configure No assembly de inicialização de hospedagem é chamado pelo tempo de execução antes do Startup.Configure no código do usuário, o que permite que o código do usuário substitua qualquer configuração fornecida pelo assembly de inicialização de hospedagem.
namespace StartupEnhancement
{
public class StartupEnhancementHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
// Use the IWebHostBuilder to add app enhancements.
}
}
}
Ao construir um IHostingStartup projeto, o ficheiro de dependências (.deps.json) define a runtime localização do assembly para a pasta bin :
"targets": {
".NETCoreApp,Version=v3.0": {
"StartupEnhancement/1.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Hosting.Abstractions": "3.0.0"
},
"runtime": {
"StartupEnhancement.dll": {}
}
}
}
}
Apenas parte do arquivo é mostrada. O nome do assembly no exemplo é StartupEnhancement.
Configuração fornecida pela inicialização de hospedagem
Há duas abordagens para lidar com a configuração, dependendo se você deseja que a configuração da inicialização de hospedagem tenha precedência ou que a configuração do aplicativo tenha precedência:
- Forneça configuração para o aplicativo usando ConfigureAppConfiguration para carregar a configuração depois que os delegados do ConfigureAppConfiguration aplicativo forem executados. A configuração de inicialização de hospedagem tem prioridade sobre a configuração do aplicativo usando essa abordagem.
- Forneça configuração para a aplicação usando UseConfiguration para carregar a configuração antes que os delegados da ConfigureAppConfiguration aplicação sejam executados. Os valores de configuração da aplicação têm prioridade sobre os fornecidos pelo startup de hospedagem usando essa abordagem.
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);
}
}
Especificar o assembly de inicialização de hospedagem
Para uma inicialização de hospedagem fornecida por aplicativo de console ou biblioteca de classes, especifique o nome do assembly de inicialização de hospedagem na ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variável de ambiente. A variável de ambiente é uma lista delimitada por ponto-e-vírgula de assemblies.
Somente os assemblies de arranque de hospedagem são verificados em relação ao atributo HostingStartup. Para o aplicativo de exemplo, HostingStartupApp, para descobrir as startups de hospedagem descritas anteriormente, a variável de ambiente é definida com o seguinte valor:
HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics
Um assembly de inicialização de hospedagem também pode ser definido usando a configuração do host para Assemblies de Inicialização de Hospedagem.
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseSetting(
WebHostDefaults.HostingStartupAssembliesKey,
"{ASSEMBLY1;ASSEMBLY2; ...}")
.UseStartup<Startup>();
});
O marcador {ASSEMBLY1;ASSEMBLY2; ...} representa a lista de assemblies separados por ponto-e-vírgula.
Quando várias assemblies de inicialização de hospedagem estão presentes, os seus Configure métodos são executados na ordem em que os assemblies estão listados.
Activation
As opções para hospedar a ativação de arranque são:
- Armazenamento em tempo de execução: a ativação não requer uma referência em tempo de compilação. O aplicativo de exemplo coloca o assembly de inicialização de hospedagem e os arquivos de dependências em uma pasta, implantação, para facilitar a implantação da inicialização de hospedagem em um ambiente multimáquina. A pasta de implantação também inclui um script do PowerShell que cria ou modifica variáveis de ambiente no sistema de implantação para habilitar a inicialização de hospedagem.
- Referência em tempo de compilação necessária para ativação
Armazenamento de tempo de execução
A implementação de inicialização de hospedagem é colocada no repositório de tempo de execução. Uma referência em tempo de compilação para o assembly não é necessária para a aplicação melhorada.
Depois que a inicialização de hospedagem é criada, um armazenamento de tempo de execução é gerado usando o arquivo de projeto de manifesto e o comando dotnet store .
dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization
No aplicativo de exemplo (projeto RuntimeStore ) o seguinte comando é usado:
dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization
Para que o runtime descubra o repositório em tempo de execução, o local deste repositório é adicionado na variável de ambiente DOTNET_SHARED_STORE.
Modificar e colocar o ficheiro de dependências da startup de hospedagem
Para ativar o aprimoramento sem uma referência de pacote ao aprimoramento, especifique dependências adicionais para o tempo de execução com additionalDeps.
additionalDeps permite-lhe:
- Estenda o gráfico da biblioteca do aplicativo fornecendo um conjunto de arquivos adicionais
.deps.jsonpara mesclar com o próprio.deps.jsonarquivo do aplicativo na inicialização. - Torne o assembly de inicialização de hospedagem detetável e carregável.
A abordagem recomendada para gerar o arquivo de dependências adicionais é:
- Execute
dotnet publishno arquivo de manifesto do repositório de tempo de execução mencionado na seção anterior. - Remova a referência de manifesto das bibliotecas e a
runtimeseção do arquivo resultante.deps.json.
No projeto de exemplo, a store.manifest/1.0.0 propriedade é removida das seções targets e 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"
}
}
}
Coloque o .deps.json arquivo no seguinte local:
{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
-
{ADDITIONAL DEPENDENCIES PATH}: Localização adicionadaDOTNET_ADDITIONAL_DEPSà variável de ambiente. -
{SHARED FRAMEWORK NAME}: Estrutura compartilhada necessária para este arquivo de dependências adicionais. -
{SHARED FRAMEWORK VERSION}: Versão mínima do framework compartilhado. -
{ENHANCEMENT ASSEMBLY NAME}: O nome do assembly da melhoria.
No aplicativo de exemplo (projeto RuntimeStore ), o arquivo de dependências adicionais é colocado no seguinte local:
deployment/additionalDeps/shared/Microsoft.AspNetCore.App/3.0.0/StartupDiagnostics.deps.json
Para que o tempo de execução possa descobrir a localização do repositório de tempo de execução, a localização do arquivo de dependências adicionais é adicionada à variável de ambiente DOTNET_ADDITIONAL_DEPS.
Note
A DOTNET_ADDITIONAL_DEPS variável de ambiente só funciona com aplicativos dependentes da estrutura. Essa variável de ambiente é ignorada para aplicativos autônomos.
No aplicativo de exemplo (projeto RuntimeStore ), a criação do repositório de tempo de execução e a geração do arquivo de dependências adicionais são realizadas usando um script do PowerShell .
Para obter exemplos de como definir variáveis de ambiente para vários sistemas operacionais, consulte Usar vários ambientes.
Deployment
Para facilitar a implementação de uma startup de hospedagem em um ambiente multimáquina, o aplicativo de exemplo cria uma pasta de implementação na saída publicada que contém:
- O armazenamento de tempo de execução de inicialização de hospedagem.
- O arquivo de dependências de inicialização de hospedagem.
- Um script do PowerShell que cria ou modifica o
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,DOTNET_SHARED_STOREeDOTNET_ADDITIONAL_DEPSpara dar suporte à ativação da inicialização de hospedagem. Execute o script a partir de um prompt de comando administrativo do PowerShell no sistema de implantação.
Pacote NuGet
Um aprimoramento de inicialização de hospedagem pode ser fornecido em um pacote NuGet. O pacote tem um HostingStartup atributo. Os tipos de inicialização de hospedagem fornecidos pelo pacote são disponibilizados para o aplicativo usando uma das seguintes abordagens:
- O arquivo de projeto do aplicativo aprimorado faz uma referência de pacote para a inicialização de hospedagem no arquivo de projeto do aplicativo (uma referência em tempo de compilação). Com a referência de tempo de compilação definida, o assembly de inicialização de hospedagem e todas as suas dependências são incorporados ao arquivo de dependência do aplicativo (
.deps.json). Essa abordagem aplica-se a um pacote de montagem de arranque para hospedagem publicado no nuget.org. - O ficheiro de dependências da startup de alojamento é disponibilizado para a aplicação melhorada tal como descrito na secção Runtime store (sem uma referência em tempo de compilação).
Para obter mais informações sobre pacotes NuGet e o repositório de tempo de execução, consulte os seguintes tópicos:
- Como criar um pacote NuGet com ferramentas multiplataforma
- Pacotes de publicação
- Repositório de pacotes de tempo de execução
Pasta bin do projeto
Um aprimoramento de startup de hospedagem pode ser fornecido por um assembly implantado na bin no aplicativo aprimorado. Os tipos de inicialização de hospedagem fornecidos pelo assembly são disponibilizados para o aplicativo usando uma das seguintes abordagens:
- O arquivo de projeto do aplicativo aprimorado faz uma referência de assembly à inicialização de hospedagem (uma referência em tempo de compilação). Com a referência de tempo de compilação definida, o assembly de inicialização de hospedagem e todas as suas dependências são incorporados ao arquivo de dependência do aplicativo (
.deps.json). Essa abordagem se aplica quando o cenário de implantação exige fazer uma referência em tempo de compilação ao assembly da inicialização de hospedagem (ficheiro .dll) e mover o assembly para:- O projeto consumidor.
- Um local acessível pelo projeto de consumo.
- O ficheiro de dependências da startup de alojamento é disponibilizado para a aplicação melhorada tal como descrito na secção Runtime store (sem uma referência em tempo de compilação).
- Ao direcionar o .NET Framework, o assembly é carregável no contexto de carga padrão, o que no .NET Framework significa que o assembly está localizado em um dos seguintes locais:
- Caminho base do aplicativo: a pasta bin onde o executável do aplicativo (.exe) está localizado.
- GAC (Global Assembly Cache): o GAC armazena assemblies que vários aplicativos do .NET Framework compartilham. Para obter mais informações, consulte Como instalar um assembly no cache de assembly global na documentação do .NET Framework.
Código de exemplo
O código de exemplo (como fazer o download) demonstra cenários de implementação de inicialização de hospedagem:
- Dois assemblies de inicialização de hospedagem (bibliotecas de classes) definem um par de pares chave-valor de configuração na memória cada:
- Pacote NuGet (HostingStartupPackage)
- Biblioteca de classes (HostingStartupLibrary)
- Uma startup de hospedagem é ativada a partir de um assembly implantado a partir de um repositório de tempo de execução (StartupDiagnostics). O assembly adiciona dois middlewares ao aplicativo na inicialização que fornecem informações de diagnóstico sobre:
- Serviços registados
- Endereço (esquema, host, base de caminho, caminho, cadeia de caracteres de consulta)
- Conexão (IP remoto, porta remota, IP local, porta local, certificado de cliente)
- Cabeçalhos da requisição
- Variáveis de ambiente
Para executar o exemplo:
Ativação de um pacote NuGet
Compile o pacote HostingStartupPackage com o comando dotnet pack .
Adicione o nome do assembly do pacote HostingStartupPackage à
ASPNETCORE_HOSTINGSTARTUPASSEMBLIESvariável de ambiente.Compile e execute o aplicativo. Uma referência de pacote está presente na aplicação melhorada (uma referência em tempo de compilação). A
<PropertyGroup>no arquivo de projeto do aplicativo especifica a saída do projeto de pacote (.. /HostingStartupPackage/bin/Debug) como fonte de pacote. Isso permite que o aplicativo use o pacote sem carregá-lo para nuget.org. Para obter mais informações, consulte as notas no arquivo de projeto do HostingStartupApp.<PropertyGroup> <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources> </PropertyGroup>Observe que os valores da chave de configuração do serviço renderizados pela página Índice correspondem aos valores definidos pelo método do
ServiceKeyInjection.Configurepacote.
Se você fizer alterações no projeto HostingStartupPackage e recompilá-lo, limpe os caches de pacotes NuGet locais para garantir que o HostingStartupApp receba o pacote atualizado e não um pacote obsoleto do cache local. Para limpar os caches NuGet locais, execute o seguinte comando dotnet nuget locals :
dotnet nuget locals all --clear
Ativação a partir de uma biblioteca de classes
Compile a biblioteca de classes HostingStartupLibrary com o comando dotnet build .
Adicione o nome do assembly da biblioteca de classes HostingStartupLibrary à
ASPNETCORE_HOSTINGSTARTUPASSEMBLIESvariável de ambiente.bin-deploy o assembly da biblioteca de classes para o aplicativo copiando o arquivo HostingStartupLibrary.dll da saída compilada da biblioteca de classes para a pasta bin/Debug do aplicativo.
Compile e execute o aplicativo. Um
<ItemGroup>no ficheiro de projeto da aplicação faz referência ao assembly da biblioteca de classes (.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll) (uma referência ao tempo de compilação). Para obter mais informações, consulte as notas no arquivo de projeto do HostingStartupApp.<ItemGroup> <Reference Include=".\\bin\\Debug\\netcoreapp3.0\\HostingStartupLibrary.dll"> <HintPath>.\bin\Debug\netcoreapp3.0\HostingStartupLibrary.dll</HintPath> <SpecificVersion>False</SpecificVersion> </Reference> </ItemGroup>Observe que os valores da chave de configuração de serviço renderizados pela página Índice correspondem aos valores definidos pelo método
ServiceKeyInjection.Configureda biblioteca de classes.
Ativação a partir de um assembly implantado pelo repositório de tempo de execução
- O projeto StartupDiagnostics usa o PowerShell para modificar seu
StartupDiagnostics.deps.jsonarquivo. O PowerShell é instalado por padrão no Windows a partir do Windows 7 SP1 e do Windows Server 2008 R2 SP1. Para obter o PowerShell em outras plataformas, consulte Instalando várias versões do PowerShell. - Execute o script build.ps1 na pasta RuntimeStore. O roteiro:
- Gera o
StartupDiagnosticspacote na pasta obj\packages . - Gera o armazenamento de tempo de execução para
StartupDiagnosticsna pasta de armazenamento . Odotnet storecomando no script usa owin7-x64para uma startup de hospedagem implantada no Windows. Ao fornecer a inicialização de hospedagem para um tempo de execução diferente, substitua o RID correto na linha 37 do script. O armazenamento de tempo de execução paraStartupDiagnosticsseria posteriormente movido para o armazenamento de tempo de execução do usuário ou do sistema na máquina onde o assembly será consumido. O local de instalação do repositório de tempo de execução do usuário para oStartupDiagnosticsassembly é .dotnet/store/x64/netcoreapp3.0/startupdiagnostics/1.0.0/lib/netcoreapp3.0/StartupDiagnostics.dll. - Gera o
additionalDepsparaStartupDiagnosticsna pasta additionalDeps. As dependências adicionais seriam posteriormente movidas para as dependências adicionais do usuário ou do sistema. O local de instalação das dependências adicionais do usuárioStartupDiagnosticsé.dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/3.0.0/StartupDiagnostics.deps.json. - Coloca o arquivo deploy.ps1 na pasta de implantação .
- Gera o
- Execute o script deploy.ps1 na pasta de implantação . O script acrescenta:
-
StartupDiagnosticspara a variável de ambienteASPNETCORE_HOSTINGSTARTUPASSEMBLIES. - O caminho das dependências de inicialização de hospedagem (na pasta de implantação do projeto RuntimeStore) para a
DOTNET_ADDITIONAL_DEPSvariável de ambiente. - O caminho de armazenamento de tempo de execução (na pasta de implantação do projeto RuntimeStore) para a
DOTNET_SHARED_STOREvariável de ambiente.
-
- Execute o aplicativo de exemplo.
- Solicitar o endpoint
/servicespara ver os serviços registados da aplicação. Peça ao/diagendpoint para ver as informações de diagnóstico.
Uma IHostingStartup implementação (inicialização de hospedagem) adiciona aprimoramentos a um aplicativo na inicialização a partir de um assembly externo. Por exemplo, uma biblioteca externa pode usar uma implementação de inicialização de hospedagem para fornecer provedores de configuração ou serviços adicionais para um aplicativo.
Visualizar ou descarregar amostra de código (como descarregar)
Atributo HostingStartup
Um atributo HostingStartup indica a presença de um assembly de inicialização de hospedagem para ativar em tempo de execução.
A assembly de entrada ou a assembly que contém a classe Startup é automaticamente verificada para o atributo HostingStartup. A lista de assemblies onde procurar HostingStartup atributos é carregada em tempo de execução a partir da configuração no WebHostDefaults.HostingStartupAssembliesKey. A lista de assemblies a serem excluídos da descoberta é carregada do WebHostDefaults.HostingStartupExcludeAssembliesKey. Para obter mais informações, consulte Web Host: Hosting Startup Assemblies e Web Host: Hosting Startup Exclude Assemblies.
No exemplo a seguir, o namespace do assembly de inicialização de hospedagem é StartupEnhancement. A classe que contém o código de inicialização de hospedagem é StartupEnhancementHostingStartup:
[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]
O HostingStartup atributo normalmente está localizado no arquivo da classe de implementação do assembly de inicialização de hospedagem IHostingStartup.
Descubra assemblies de inicialização de hospedagem carregados
Para descobrir os conjuntos de inicialização de hospedagem carregados, ative o logging e verifique os logs da aplicação. Os erros que ocorrem ao carregar assemblies são registrados. Os conjuntos de inicialização de hospedagem carregados são registados ao nível de Depuração, e todos os erros são registados.
Desativar o carregamento automático de assemblies de inicialização de hospedagem
Para desativar o carregamento automático de assemblies de inicialização de hospedagem, use uma das seguintes abordagens:
- Para impedir que todos os assemblies de inicialização de hospedagem sejam carregados, configure uma das seguintes como
trueou1:- configuração do host Impedir Inicialização de Hospedagem.
-
ASPNETCORE_PREVENTHOSTINGSTARTUPvariável de ambiente.
- Para impedir o carregamento de assemblies específicos de inicialização de hospedagem, defina uma das seguintes opções como uma cadeia de caracteres delimitada por ponto e vírgula, especificando os assemblies a excluir na inicialização:
- Definição de configuração do host Hosting Startup Exclude Assemblies .
-
ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIESvariável de ambiente.
Se a definição de configuração do host e a variável de ambiente estiverem definidas, a configuração do host controlará o comportamento.
Desativar assemblies de inicialização de hospedagem através da configuração de hospedagem ou de variáveis de ambiente desativa o assembly globalmente e pode desativar várias características de uma aplicação.
Project
Crie uma inicialização de hospedagem com um dos seguintes tipos de projeto:
Biblioteca de classes
Um aprimoramento de inicialização de hospedagem pode ser fornecido em uma biblioteca de classes. A biblioteca contém um HostingStartup atributo.
O código de exemplo inclui um Razor aplicativo Pages, HostingStartupApp, e uma biblioteca de classes, HostingStartupLibrary. A biblioteca de classes
- Contém uma classe startup de hospedagem,
ServiceKeyInjection, que implementaIHostingStartup.ServiceKeyInjectionadiciona um par de cadeias de caracteres de serviço à configuração do aplicativo usando o provedor de configuração na memória (AddInMemoryCollection). - Inclui um
HostingStartupatributo que identifica o namespace e a classe da inicialização de hospedagem.
O ServiceKeyInjection método da Configure classe usa um IWebHostBuilder para adicionar aprimoramentos a um aplicativo.
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);
});
}
}
}
A página Índice da aplicação lê e apresenta os valores de configuração para as duas chaves definidas pelo assembly de inicialização de hospedagem da biblioteca de classes.
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()
{
}
}
O código de exemplo também inclui um projeto de pacote NuGet que fornece uma inicialização de hospedagem separada, HostingStartupPackage. O pacote tem as mesmas características da biblioteca de classes descritas anteriormente. O pacote:
- Contém uma classe startup de hospedagem,
ServiceKeyInjection, que implementaIHostingStartup.ServiceKeyInjectionAdiciona um par de cadeias de caracteres de serviço à configuração do aplicativo. - Inclui um
HostingStartupatributo.
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);
});
}
}
}
A página Índice do aplicativo lê e apresenta os valores de configuração para as duas chaves definidas pelo assembly de iniciação de hospedagem do pacote.
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()
{
}
}
Aplicativo de console sem um ponto de entrada
Essa abordagem só está disponível para aplicativos .NET, não para o .NET Framework.
Uma melhoria de inicialização dinâmica de hospedagem, que não requer uma referência em tempo de compilação para ativação, pode ser fornecida num aplicativo de console sem um ponto de entrada que contenha um atributo HostingStartup. A publicação do aplicativo de console produz um assembly de inicialização de hospedagem que pode ser consumido a partir do repositório de tempo de execução.
Um aplicativo de console sem um ponto de entrada é usado nesse processo porque:
- Um arquivo de dependências é necessário para consumir a inicialização de hospedagem no assembly de inicialização de hospedagem. Um arquivo de dependências é um ativo de aplicativo executável que é produzido pela publicação de um aplicativo, não de uma biblioteca.
- Uma biblioteca não pode ser adicionada diretamente ao repositório de pacotes de tempo de execução, o que requer um projeto executável destinado ao tempo de execução compartilhado.
Na criação de uma startup de hospedagem dinâmica:
- Um conjunto de inicialização de hospedagem é criado a partir da aplicação de consola sem um ponto de entrada que:
- Inclui uma classe que contém a
IHostingStartupimplementação. - Inclui um atributo HostingStartup para identificar a classe de
IHostingStartupimplementação.
- Inclui uma classe que contém a
- A aplicação de console é publicada para obter as dependências do arranque de hospedagem. Uma consequência da publicação do aplicativo de console é que as dependências não utilizadas são cortadas do arquivo de dependências.
- O ficheiro de dependências é modificado para definir o local de execução do assembly de inicialização de hospedagem.
- O assembly de inicialização de hospedagem e seu arquivo de dependências são colocados no repositório de pacotes de tempo de execução. Para descobrir o assembly de inicialização de hospedagem e seu arquivo de dependências, eles são listados em um par de variáveis de ambiente.
O aplicativo de console faz referência ao pacote 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>
Um atributo HostingStartup identifica uma classe como uma implementação de IHostingStartup para carregamento e execução ao construir o IWebHost. No exemplo a seguir, o namespace é StartupEnhancement, e a classe é StartupEnhancementHostingStartup:
[assembly: HostingStartup(typeof(StartupEnhancement.StartupEnhancementHostingStartup))]
Uma classe implementa IHostingStartup. O método da Configure classe usa um IWebHostBuilder para adicionar aprimoramentos a um aplicativo.
IHostingStartup.Configure No assembly de inicialização de hospedagem é chamado pelo tempo de execução antes do Startup.Configure no código do usuário, o que permite que o código do usuário substitua qualquer configuração fornecida pelo assembly de inicialização de hospedagem.
namespace StartupEnhancement
{
public class StartupEnhancementHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
// Use the IWebHostBuilder to add app enhancements.
}
}
}
Ao construir um IHostingStartup projeto, o ficheiro de dependências (.deps.json) define a runtime localização do assembly para a pasta bin :
"targets": {
".NETCoreApp,Version=v2.1": {
"StartupEnhancement/1.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Hosting.Abstractions": "2.1.1"
},
"runtime": {
"StartupEnhancement.dll": {}
}
}
}
}
Apenas parte do arquivo é mostrada. O nome do assembly no exemplo é StartupEnhancement.
Configuração fornecida pela inicialização de hospedagem
Há duas abordagens para lidar com a configuração, dependendo se você deseja que a configuração da inicialização de hospedagem tenha precedência ou que a configuração do aplicativo tenha precedência:
- Forneça configuração para o aplicativo usando ConfigureAppConfiguration para carregar a configuração depois que os delegados do ConfigureAppConfiguration aplicativo forem executados. A configuração de inicialização de hospedagem tem prioridade sobre a configuração do aplicativo usando essa abordagem.
- Forneça configuração para a aplicação usando UseConfiguration para carregar a configuração antes que os delegados da ConfigureAppConfiguration aplicação sejam executados. Os valores de configuração da aplicação têm prioridade sobre os fornecidos pelo startup de hospedagem usando essa abordagem.
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);
}
}
Especificar o assembly de inicialização de hospedagem
Para uma inicialização de hospedagem fornecida por aplicativo de console ou biblioteca de classes, especifique o nome do assembly de inicialização de hospedagem na ASPNETCORE_HOSTINGSTARTUPASSEMBLIES variável de ambiente. A variável de ambiente é uma lista delimitada por ponto-e-vírgula de assemblies.
Somente os assemblies de arranque de hospedagem são verificados em relação ao atributo HostingStartup. Para o aplicativo de exemplo, HostingStartupApp, para descobrir as startups de hospedagem descritas anteriormente, a variável de ambiente é definida com o seguinte valor:
HostingStartupLibrary;HostingStartupPackage;StartupDiagnostics
Um assembly de hosting startup pode ser também definido usando a configuração do host Hosting Startup Assemblies.
Quando várias assemblies de inicialização de hospedagem estão presentes, os seus Configure métodos são executados na ordem em que os assemblies estão listados.
Activation
As opções para hospedar a ativação de arranque são:
- Armazenamento em tempo de execução: a ativação não requer uma referência em tempo de compilação. O aplicativo de exemplo coloca o assembly de inicialização de hospedagem e os arquivos de dependências em uma pasta, implantação, para facilitar a implantação da inicialização de hospedagem em um ambiente multimáquina. A pasta de implantação também inclui um script do PowerShell que cria ou modifica variáveis de ambiente no sistema de implantação para habilitar a inicialização de hospedagem.
- Referência em tempo de compilação necessária para ativação
Armazenamento de tempo de execução
A implementação de inicialização de hospedagem é colocada no repositório de tempo de execução. Uma referência em tempo de compilação para o assembly não é necessária para a aplicação melhorada.
Depois que a inicialização de hospedagem é criada, um armazenamento de tempo de execução é gerado usando o arquivo de projeto de manifesto e o comando dotnet store .
dotnet store --manifest {MANIFEST FILE} --runtime {RUNTIME IDENTIFIER} --output {OUTPUT LOCATION} --skip-optimization
No aplicativo de exemplo (projeto RuntimeStore ) o seguinte comando é usado:
dotnet store --manifest store.manifest.csproj --runtime win7-x64 --output ./deployment/store --skip-optimization
Para que o runtime descubra o repositório em tempo de execução, o local deste repositório é adicionado na variável de ambiente DOTNET_SHARED_STORE.
Modificar e colocar o ficheiro de dependências da startup de hospedagem
Para ativar o aprimoramento sem uma referência de pacote ao aprimoramento, especifique dependências adicionais para o tempo de execução com additionalDeps.
additionalDeps permite-lhe:
- Estenda o gráfico da biblioteca do aplicativo fornecendo um conjunto de arquivos adicionais
.deps.jsonpara mesclar com o próprio.deps.jsonarquivo do aplicativo na inicialização. - Torne o assembly de inicialização de hospedagem detetável e carregável.
A abordagem recomendada para gerar o arquivo de dependências adicionais é:
- Execute
dotnet publishno arquivo de manifesto do repositório de tempo de execução mencionado na seção anterior. - Remova a referência de manifesto das bibliotecas e a
runtimeseção do arquivo resultante.deps.json.
No projeto de exemplo, a store.manifest/1.0.0 propriedade é removida das seções targets e 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"
}
}
}
Coloque o .deps.json arquivo no seguinte local:
{ADDITIONAL DEPENDENCIES PATH}/shared/{SHARED FRAMEWORK NAME}/{SHARED FRAMEWORK VERSION}/{ENHANCEMENT ASSEMBLY NAME}.deps.json
-
{ADDITIONAL DEPENDENCIES PATH}: Localização adicionadaDOTNET_ADDITIONAL_DEPSà variável de ambiente. -
{SHARED FRAMEWORK NAME}: Estrutura compartilhada necessária para este arquivo de dependências adicionais. -
{SHARED FRAMEWORK VERSION}: Versão mínima do framework compartilhado. -
{ENHANCEMENT ASSEMBLY NAME}: O nome do assembly da melhoria.
No aplicativo de exemplo (projeto RuntimeStore ), o arquivo de dependências adicionais é colocado no seguinte local:
deployment/additionalDeps/shared/Microsoft.AspNetCore.App/2.1.0/StartupDiagnostics.deps.json
Para que o tempo de execução possa descobrir a localização do repositório de tempo de execução, a localização do arquivo de dependências adicionais é adicionada à variável de ambiente DOTNET_ADDITIONAL_DEPS.
Note
A DOTNET_ADDITIONAL_DEPS variável de ambiente só funciona com aplicativos dependentes da estrutura. Essa variável de ambiente é ignorada para aplicativos autônomos.
No aplicativo de exemplo (projeto RuntimeStore ), a criação do repositório de tempo de execução e a geração do arquivo de dependências adicionais são realizadas usando um script do PowerShell .
Para obter exemplos de como definir variáveis de ambiente para vários sistemas operacionais, consulte Usar vários ambientes.
Deployment
Para facilitar a implementação de uma startup de hospedagem em um ambiente multimáquina, o aplicativo de exemplo cria uma pasta de implementação na saída publicada que contém:
- O armazenamento de tempo de execução de inicialização de hospedagem.
- O arquivo de dependências de inicialização de hospedagem.
- Um script do PowerShell que cria ou modifica o
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,DOTNET_SHARED_STOREeDOTNET_ADDITIONAL_DEPSpara dar suporte à ativação da inicialização de hospedagem. Execute o script a partir de um prompt de comando administrativo do PowerShell no sistema de implantação.
Pacote NuGet
Um aprimoramento de inicialização de hospedagem pode ser fornecido em um pacote NuGet. O pacote tem um HostingStartup atributo. Os tipos de inicialização de hospedagem fornecidos pelo pacote são disponibilizados para o aplicativo usando uma das seguintes abordagens:
- O arquivo de projeto do aplicativo aprimorado faz uma referência de pacote para a inicialização de hospedagem no arquivo de projeto do aplicativo (uma referência em tempo de compilação). Com a referência de tempo de compilação definida, o assembly de inicialização de hospedagem e todas as suas dependências são incorporados ao arquivo de dependência do aplicativo (
.deps.json). Essa abordagem aplica-se a um pacote de montagem de arranque para hospedagem publicado no nuget.org. - O ficheiro de dependências da startup de alojamento é disponibilizado para a aplicação melhorada tal como descrito na secção Runtime store (sem uma referência em tempo de compilação).
Para obter mais informações sobre pacotes NuGet e o repositório de tempo de execução, consulte os seguintes tópicos:
- Como criar um pacote NuGet com ferramentas multiplataforma
- Pacotes de publicação
- Repositório de pacotes de tempo de execução
Pasta bin do projeto
Um aprimoramento de startup de hospedagem pode ser fornecido por um assembly implantado na bin no aplicativo aprimorado. Os tipos de inicialização de hospedagem fornecidos pelo assembly são disponibilizados para o aplicativo usando uma das seguintes abordagens:
- O arquivo de projeto do aplicativo aprimorado faz uma referência de assembly à inicialização de hospedagem (uma referência em tempo de compilação). Com a referência de tempo de compilação definida, o assembly de inicialização de hospedagem e todas as suas dependências são incorporados ao arquivo de dependência do aplicativo (
.deps.json). Essa abordagem se aplica quando o cenário de implantação exige fazer uma referência em tempo de compilação ao assembly da inicialização de hospedagem (ficheiro .dll) e mover o assembly para:- O projeto consumidor.
- Um local acessível pelo projeto de consumo.
- O ficheiro de dependências da startup de alojamento é disponibilizado para a aplicação melhorada tal como descrito na secção Runtime store (sem uma referência em tempo de compilação).
- Ao direcionar o .NET Framework, o assembly é carregável no contexto de carga padrão, o que no .NET Framework significa que o assembly está localizado em um dos seguintes locais:
- Caminho base do aplicativo: a pasta bin onde o executável do aplicativo (.exe) está localizado.
- GAC (Global Assembly Cache): o GAC armazena assemblies que vários aplicativos do .NET Framework compartilham. Para obter mais informações, consulte Como instalar um assembly no cache de assembly global na documentação do .NET Framework.
Código de exemplo
O código de exemplo (como fazer o download) demonstra cenários de implementação de inicialização de hospedagem:
- Dois assemblies de inicialização de hospedagem (bibliotecas de classes) definem um par de pares chave-valor de configuração na memória cada:
- Pacote NuGet (HostingStartupPackage)
- Biblioteca de classes (HostingStartupLibrary)
- Uma startup de hospedagem é ativada a partir de um assembly implantado a partir de um repositório de tempo de execução (StartupDiagnostics). O assembly adiciona dois middlewares ao aplicativo na inicialização que fornecem informações de diagnóstico sobre:
- Serviços registados
- Endereço (esquema, host, base de caminho, caminho, cadeia de caracteres de consulta)
- Conexão (IP remoto, porta remota, IP local, porta local, certificado de cliente)
- Cabeçalhos da requisição
- Variáveis de ambiente
Para executar o exemplo:
Ativação de um pacote NuGet
Compile o pacote HostingStartupPackage com o comando dotnet pack .
Adicione o nome do assembly do pacote HostingStartupPackage à
ASPNETCORE_HOSTINGSTARTUPASSEMBLIESvariável de ambiente.Compile e execute o aplicativo. Uma referência de pacote está presente na aplicação melhorada (uma referência em tempo de compilação). A
<PropertyGroup>no arquivo de projeto do aplicativo especifica a saída do projeto de pacote (.. /HostingStartupPackage/bin/Debug) como fonte de pacote. Isso permite que o aplicativo use o pacote sem carregá-lo para nuget.org. Para obter mais informações, consulte as notas no arquivo de projeto do HostingStartupApp.<PropertyGroup> <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;../HostingStartupPackage/bin/Debug</RestoreSources> </PropertyGroup>Observe que os valores da chave de configuração do serviço renderizados pela página Índice correspondem aos valores definidos pelo método do
ServiceKeyInjection.Configurepacote.
Se você fizer alterações no projeto HostingStartupPackage e recompilá-lo, limpe os caches de pacotes NuGet locais para garantir que o HostingStartupApp receba o pacote atualizado e não um pacote obsoleto do cache local. Para limpar os caches NuGet locais, execute o seguinte comando dotnet nuget locals :
dotnet nuget locals all --clear
Ativação a partir de uma biblioteca de classes
Compile a biblioteca de classes HostingStartupLibrary com o comando dotnet build .
Adicione o nome do assembly da biblioteca de classes HostingStartupLibrary à
ASPNETCORE_HOSTINGSTARTUPASSEMBLIESvariável de ambiente.bin-deploy o assembly da biblioteca de classes para o aplicativo copiando o arquivo HostingStartupLibrary.dll da saída compilada da biblioteca de classes para a pasta bin/Debug do aplicativo.
Compile e execute o aplicativo. Um
<ItemGroup>no arquivo de projeto do aplicativo faz referência ao assembly da biblioteca de classes (.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll) (uma referência em tempo de compilação). Para obter mais informações, consulte as notas no arquivo de projeto do HostingStartupApp.<ItemGroup> <Reference Include=".\\bin\\Debug\\netcoreapp2.1\\HostingStartupLibrary.dll"> <HintPath>.\bin\Debug\netcoreapp2.1\HostingStartupLibrary.dll</HintPath> <SpecificVersion>False</SpecificVersion> </Reference> </ItemGroup>Observe que os valores da chave de configuração de serviço renderizados pela página Índice correspondem aos valores definidos pelo método
ServiceKeyInjection.Configureda biblioteca de classes.
Ativação a partir de um assembly implantado pelo repositório de tempo de execução
- O projeto StartupDiagnostics usa o PowerShell para modificar seu
StartupDiagnostics.deps.jsonarquivo. O PowerShell é instalado por padrão no Windows a partir do Windows 7 SP1 e do Windows Server 2008 R2 SP1. Para obter o PowerShell em outras plataformas, consulte Instalando várias versões do PowerShell. - Execute o script build.ps1 na pasta RuntimeStore. O roteiro:
- Gera o
StartupDiagnosticspacote na pasta obj\packages . - Gera o armazenamento de tempo de execução para
StartupDiagnosticsna pasta de armazenamento . Odotnet storecomando no script usa owin7-x64para uma startup de hospedagem implantada no Windows. Ao fornecer a inicialização de hospedagem para um tempo de execução diferente, substitua o RID correto na linha 37 do script. O armazenamento de tempo de execução paraStartupDiagnosticsseria posteriormente movido para o armazenamento de tempo de execução do usuário ou do sistema na máquina onde o assembly será consumido. O local de instalação do repositório de tempo de execução do usuário para oStartupDiagnosticsassembly é .dotnet/store/x64/netcoreapp2.2/startupdiagnostics/1.0.0/lib/netcoreapp2.2/StartupDiagnostics.dll. - Gera o
additionalDepsparaStartupDiagnosticsna pasta additionalDeps. As dependências adicionais seriam posteriormente movidas para as dependências adicionais do usuário ou do sistema. O local de instalação das dependências adicionais do usuárioStartupDiagnosticsé.dotnet/x64/additionalDeps/StartupDiagnostics/shared/Microsoft.NETCore.App/2.2.0/StartupDiagnostics.deps.json. - Coloca o arquivo deploy.ps1 na pasta de implantação .
- Gera o
- Execute o script deploy.ps1 na pasta de implantação . O script acrescenta:
-
StartupDiagnosticspara a variável de ambienteASPNETCORE_HOSTINGSTARTUPASSEMBLIES. - O caminho das dependências de inicialização de hospedagem (na pasta de implantação do projeto RuntimeStore) para a
DOTNET_ADDITIONAL_DEPSvariável de ambiente. - O caminho de armazenamento de tempo de execução (na pasta de implantação do projeto RuntimeStore) para a
DOTNET_SHARED_STOREvariável de ambiente.
-
- Execute o aplicativo de exemplo.
- Solicitar o endpoint
/servicespara ver os serviços registados da aplicação. Peça ao/diagendpoint para ver as informações de diagnóstico.