Pergunta

Armazenar toda a sessão em um cookie tem sido padrão em Rails para os últimos anos? - há uma maneira fácil de conseguir algo semelhante com ASP MVC

Por padrão, qualquer coisa em Sessão / TempData é armazenado na memória no servidor. Em web.config isso pode ser alterado para um cache SQL Store / server-side. Eu gostaria de ser capaz de ter esses objetos persistiu em um cookie.

Parece que eu poderia implementar um costume Provider Session-State Store. Existe uma abordagem mais simples?

Foi útil?

Solução

sim, implementar um estado personalizado sessão do provedor . E não, afaik não há uma abordagem mais simples.

Ps. não é tão ruim quanto parece ie> metade do ODBC amostra está escrevendo para o db.

Outras dicas

Eu acho que seria muito mais eficiente para apenas armazenar o ID da sessão (um hash ou qualquer outro) no cookie, e depois usar essa ID para obter os dados da sessão a partir da memória / banco de dados / whatever de armazenamento que você preferir. Manter o estado da sessão completa em um cookie aumentos de largura de banda innecessarily.

Além disso, manter a segurança em mente: se o cookie contém informações de autenticação ou outros dados sensíveis e você não tiver cuidado, ele pode facilmente ser cortado pelo usuário para obter privilégios ou não mexer com a sua aplicação (criptografar os dados suga demasiado , porque então você tem que base-64 codificar os dados criptografados, o que mais desperdiça largura de banda e tempo de processamento). Você deve não de entrada confiança do usuário.

Eu fortemente desencorajar armazenar toda a sessão em cookies. Tem implicações mau desempenho. Considere o seguinte: cada pedido (para todos os recursos) irá conter uma sobrecarga de dados possivelmente obsoletos que você só precisa de uma ou duas vezes. Eventualmente, essa sobrecarga vai bater seus usuários, a sua largura de banda e seu desempenho do site.

Aqui está um exemplo:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

tamanho do pedido inicial é de cerca de 200 bytes. Vamos dizer, você adicionar cerca de 100 bytes para sua sessão. Agora, a dimensão é de 300 bytes e a sobrecarga é ~ 30%. Você pode adicionar mais 100 bytes, e a sobrecarga é de 50%. O que significa que aproximadamente requer tempo 2x para enviar o pedido e 2x largura de banda.

Você deve, antes, olhar para baseada em cookie TempData implementação, pois tem muito menor pegada e realmente faz sentido.

Eu recomendo armazenar TempData no cookie (em oposição a toda a sessão).

Para armazenar TempData no cookie, você precisará substituir ITempDataProvider e implementar seu próprio provedor personalizado.

Há realmente um pacote NuGet disponível (que faz isso implementação personalizada para você): BrockAllen.CookieTempData e aqui é a documentação . A coisa boa sobre este pacote é que ele tanto compressa e criptografa seu TempData, assim você não precisa se preocupar com o envio de texto simples através da Internet.

Tudo que você precisa fazer é instalar o pacote NuGet e depois substituir CreateTempDataProvider em sua classe ControllerBase:

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}

Você não deve usar Sessões para isso, mas Profiles vez. Perfis usar cookies para coincidir com computadores para perfis, etc. A chave perfil é armazenado em um cookie, e não é perdido quando fechar o navegador etc.

Info aqui; http://odetocode.com/articles/440.aspx

depende de que tipo de dados que você deseja armazenar no cookie, se você quiser apenas para string loja, o seguinte código vai fazer:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top