Migração incremental do estado da sessão do ASP.NET para o ASP.NET Core
Estado de sessão
O estado da sessão no ASP.NET Framework forneceu vários recursos que o ASP.NET Core não fornece. Para atualizar do ASP.NET Framework para o Core, os adaptadores fornecem mecanismos para habilitar o preenchimento do estado da sessão com um comportamento semelhante como System.Web
fez. Algumas das diferenças entre estrutura e núcleo são:
- O ASP.NET Framework bloquearia o uso da sessão em uma sessão, de modo que as solicitações subsequentes em uma sessão fossem tratadas de forma serial. É diferente do ASP.NET Core, que não fornece nenhuma dessas garantias.
- O ASP.NET Framework serializaria e desserializaria objetos automaticamente (a menos que seja feito na memória). O ASP.NET Core fornece um mecanismo para armazenar uma
byte[]
determinada chave. Qualquer serialização/desserialização de objeto deve ser feita manualmente pelo usuário.
A infraestrutura do adaptador expõe duas interfaces que podem ser usadas para implementar qualquer sistema de armazenamento de sessão. Eles são:
Microsoft.AspNetCore.SystemWebAdapters.ISessionManager
: tem um único método que recebe um HttpContext e os metadados da sessão e espera que um objetoISessionState
seja retornado.Microsoft.AspNetCore.SystemWebAdapters.ISessionState
: descreve o estado de um objeto de sessão. Ele é usado como o suporte do tipo HttpSessionState.
Serialização
Como os adaptadores fornecem a capacidade de trabalhar com o estado de sessão fortemente tipado, devemos ser capazes de serializar e desserializar tipos. Isso é personalizado por meio do Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer
.
É fornecida uma implementação JSON padrão que é configurada por meio do JsonSessionSerializerOptions
:
RegisterKey<T>(string)
- Registra uma chave de sessão em um tipo conhecido. É necessário para serializar/desserializar o estado da sessão corretamente. Se uma chave for encontrada para a qual não há registro, um erro será gerado e a sessão não estará disponível.
builder.Services.AddSystemWebAdapters()
.AddJsonSessionSerializer(options =>
{
// Serialization/deserialization requires each session key to be registered to a type
options.RegisterKey<int>("test-value");
});
Implementações
Há duas implementações disponíveis do objeto de estado de sessão que atualmente são enviadas, cada uma com algumas compensações de recursos. A melhor opção para um aplicativo pode depender de qual parte da migração ele está e pode mudar ao longo do tempo.
- Fortemente tipado: fornece a capacidade de acessar um objeto e pode ser convertido no tipo esperado
- Bloqueio: garante que várias solicitações em uma única sessão sejam colocadas em fila e não acessem a sessão ao mesmo tempo
- Autônomo: use quando não estiver compartilhando a sessão entre ASP.NET Framework e ASP.NET Core para evitar a modificação de código em bibliotecas de classes que fazem referência a SessionState
Abaixo estão as implementações disponíveis:
Implementação | Fortemente tipado | Bloqueio | Autônomo |
---|---|---|---|
Aplicativo remoto | ✔️ | ✔️ | ⛔ |
ASP.NET Core encapsulado | ✔️ | ⛔ | ✔️ |