Nuuvify.CommonPack.Middleware 2.9.0

dotnet add package Nuuvify.CommonPack.Middleware --version 2.9.0
                    
NuGet\Install-Package Nuuvify.CommonPack.Middleware -Version 2.9.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Nuuvify.CommonPack.Middleware" Version="2.9.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Nuuvify.CommonPack.Middleware" Version="2.9.0" />
                    
Directory.Packages.props
<PackageReference Include="Nuuvify.CommonPack.Middleware" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Nuuvify.CommonPack.Middleware --version 2.9.0
                    
#r "nuget: Nuuvify.CommonPack.Middleware, 2.9.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Nuuvify.CommonPack.Middleware@2.9.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Nuuvify.CommonPack.Middleware&version=2.9.0
                    
Install as a Cake Addin
#tool nuget:?package=Nuuvify.CommonPack.Middleware&version=2.9.0
                    
Install as a Cake Tool

Quality Gate Status

Middlewares, filtros e extensões de configuração para aplicações ASP.NET Core.

Índice

Quando usar

Use este pacote quando a aplicação precisar dos middlewares do pacote ou de carregar secrets montados em configuração hierárquica.

Instalação

<PackageReference Include="Nuuvify.CommonPack.Middleware" Version="2.8.0" />

Configuração

Para secrets montados por Docker, Podman ou Kubernetes, registre o diretório durante o startup:

builder.Configuration.AddContainerSecrets("/run/secrets");

Quando o caminho precisa seguir o padrão do sistema operacional, use o resolvedor sem estado:

var secretsPath = builder.GetContainerSecretsPath();
builder.Configuration.AddContainerSecrets(secretsPath, optional: true);

O padrão é fail-closed (optional: false) e sem recarga automática (reloadOnChange: false). Para um diretório opcional:

builder.Configuration.AddContainerSecrets("/run/secrets", optional: true);

Um arquivo chamado Database__Password fica disponível como Database:Password. O provider KeyPerFile não altera, copia ou remove os arquivos montados. Permissões, montagem e rotação pertencem ao runtime ou ao orquestrador.

O método legado AddEnvironmentVariablesToKeyPerFile continua disponível para compatibilidade, mas está obsoleto. Ele agora captura os valores em memória e pode remover as variáveis somente do processo atual quando removeVariavel for verdadeiro. Para novos mounts de secrets, prefira AddContainerSecrets; para arquivos .env, use AddDotEnvConfiguration.

PathSecrets, SetPathSecretsToOSPlatform e GetPathSecretsToOSPlatform também estão obsoletos. Eles permanecem para compatibilidade, mas mantêm estado estático e devem ser substituídos por GetContainerSecretsPath.

Os providers são aplicados na ordem em que são registrados; fontes posteriores podem substituir chaves anteriores.

Dotenv canônico

Para carregar um arquivo .env sem materializar seus valores no ambiente do processo, use:

builder.AddDotEnvConfiguration();

O parser separa chave e valor no primeiro =, preserva valores vazios, converte __ em : e insere a fonte abaixo das fontes já registradas. Assim, variáveis de ambiente reais, secrets montados e argumentos de linha de comando podem manter precedência conforme a composição do host.

Tratamento de exceções

Para aplicações novas, registre o handler baseado em IExceptionHandler e ProblemDetailsService no composition root:

builder.Services.AddProblemDetailsExceptionHandler();

O registro é opt-in e deve ser combinado com app.UseExceptionHandler(). O handler retorna application/problem+json com mensagem genérica e registra a exceção somente no logger. O middleware legado UseGlobalExceptionHandlerMiddleware continua disponível para consumidores existentes e mantém o envelope anterior.

Contexto de operação

Para integrar requisições HTTP ao contexto neutro de observabilidade, registre o accessor e adicione o adapter ao pipeline:

builder.Services.AddOperationContextHeaders();
app.UseOperationContextHeaders();

O adapter preserva o CorrelationId recebido, cria um identificador quando o header não existe e restaura o contexto anterior ao finalizar a requisição. O middleware legado UseHandlingHeadersMiddleware continua disponível para consumidores existentes.

Validação

Para APIs novas, registre a resposta canônica de validação do ASP.NET Core:

builder.Services.AddCanonicalValidation();

Quando o MVC já foi registrado, aplique a extensão diretamente ao builder existente para evitar um segundo registro de controllers:

builder.Services.AddControllers().AddCanonicalValidation();

O setup responde com HTTP 400 e ValidationProblemDetails. O filtro legado ValidateModelStateCustomAttribute permanece disponível para endpoints que dependem do contrato anterior com HTTP 417.

Segurança

IConfiguration não é um cofre de secrets. Evite expor valores em logs, diagnósticos, dumps ou endpoints e controle as permissões do diretório montado. O pacote não implementa criptografia, rotação ou eliminação de cópias fora do processo atual.

Compatibilidade

  • .NET 8.
  • Depende de Microsoft.Extensions.Configuration.KeyPerFile.
  • Compatível com diretórios de secrets montados em modo somente leitura.

Troubleshooting

O diretório obrigatório não existe

Verifique o mount e as permissões do runtime. Use optional: true somente quando a ausência do diretório for realmente aceitável.

A chave não aparece na configuração

Confirme o nome do arquivo, o diretório registrado e a ordem dos providers. Use Database__Password para obter Database:Password e não registre o valor do secret durante o diagnóstico.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.9.0 74 8/26/2026
2.9.0-preview.45 36 8/26/2026
2.9.0-preview.44 43 8/26/2026
2.9.0-preview.43 49 8/23/2026
2.8.0 155 8/11/2026
2.8.0-preview.42 55 8/23/2026
2.8.0-preview.39 64 8/7/2026
2.7.0 421 7/25/2026
2.7.0-preview.26072428 55 7/25/2026
2.7.0-preview.26072419 56 7/25/2026
2.7.0-preview.26072416 58 7/25/2026
2.7.0-preview.26072413 70 7/25/2026
2.7.0-preview.26072410 56 7/24/2026
2.7.0-preview.26072406 56 7/24/2026
2.7.0-preview.26072302 127 7/23/2026
2.5.4 409 6/26/2026
2.5.3 135 6/25/2026
2.5.2 225 6/24/2026
2.5.2-preview.26062502 67 6/25/2026
2.5.2-preview.26062402 78 6/24/2026
Loading failed

# Changelog - Nuuvify.CommonPack.Middleware

Todas as mudanças notáveis deste pacote serão documentadas neste arquivo.

O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-br/1.0.0/),
e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/spec/v2.0.0.html).

## [Não Lançado]

### Adicionado

- Nova extensão `AddContainerSecrets` para carregar secrets montados usando o provider `KeyPerFile`.
- Handler opt-in baseado em `IExceptionHandler` e `ProblemDetailsService`.
- Adapter HTTP opt-in para preencher `OperationContext` por requisição.
- Loader canônico `AddDotEnvConfiguration` sem mutação do ambiente do processo.
- Setup opt-in `AddCanonicalValidation` com HTTP 400 e `ValidationProblemDetails`.
- Integração de `AddCanonicalValidation` com `IMvcBuilder` existente.

### Compatibilidade

- `PathSecrets`, `SetPathSecretsToOSPlatform` e `GetPathSecretsToOSPlatform` agora emitem aviso de obsolescência não bloqueante; use `GetContainerSecretsPath`.
- `AddEnvironmentVariablesToKeyPerFile` agora emite aviso de obsolescência não bloqueante; use `AddContainerSecrets` ou `AddDotEnvConfiguration`.
- `AddEnvironmentVariablesToMemoryCollection` agora emite aviso de obsolescência não bloqueante; use o provider nativo de variáveis ou `AddDotEnvConfiguration`.
- `ValidateModelStateCustomAttribute`, `FileStreamResultCustom` e `GetFilesBase64` agora emitem avisos de obsolescência não bloqueantes; use os APIs nativos do ASP.NET Core.

### Alterado

- Guards e logging estruturado modernizados sem alterar o comportamento dos adapters.
- Parser dotenv passou a explicitar comparação ordinal e o tipo concreto do dicionário interno.

### Corrigido

- Carregamento silenciosamente vazio de `AddEnvironmentVariablesToKeyPerFile` após a remoção do diretório temporário.
- Validação de argumentos de `AddContainerSecrets` agora usa guard clause nativa.

### Removido

### Segurança

- Eliminada a persistência temporária de secrets em arquivos locais pelo método legado.
- Respostas modernas de exceção não expõem mensagens internas.

## [Sem versão registrada] - 2026-05-29

### Histórico

- Estrutura inicial do changelog padronizada para este pacote.