Partilhar via


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 objeto ISessionStateseja 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 ✔️ ✔️