Pergunta

Eu estou trabalhando em um aplicativo do Windows. Eu preciso para simular Session (que temos em um aplicativo web) no aplicativo win, onde se o usuário estiver inativo por determinado período, ele fica desconectado. O status de login do usuário é mantido no banco de dados.

Todas as ideias inovadoras ???

Foi útil?

Solução

Você não precisa de Session (ou CallContext, ou qualquer outra coisa), apenas um Singleton "loja de usuário" com uma restrição:

Depois que o usuário logado ou mostrou alguma atividade, você tem que salvar a data / hora do que isso. Da próxima vez, quando as necessidades do usuário fazer alguma coisa, basta comparar (lastactivity + logouttime) para a data / hora real.

Contorno do processo poderia ser:

              [User login]
                   |
                   !
 [User 'store' saves user date + login time]
 [This is a singleton                      ]

                  ...

[Next time user wants to do something. The   ]
[program asks user data from the user 'store']
                   |
                   !
[If the actual time is greater than user     ]
[lastactivity + LOGOUTTIME, user cannot do it]
[If not, then update last activity           ]

UserStore pode ser implementado como um dicionário e usado como:

// Log in
Singleton.UserStore.Add("John", new UserData( yourUserObject, DateTime.Now));

...

// Check (ie. in a property-get)
var userData = Singleton.UserStore["John"];
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now()) 
{
   throw UserAutomaticallyLoggedOut();
}
else
{
   userData.LastActivityDate = DateTime.Now();
}

Outras dicas

O que vem à mente é usar um BackgroundWorker para fazer logoff do usuário quando um temporizador chega a zero. Este temporizador é reposto em cada ação que o usuário faz. Ou poderia até ser agarrado ao mouse ou teclado eventos para que quando o usuário não mova o mouse ou não está usando o teclado a contagem temporizador para baixo até que ele atinja o log off tempo.

Você pode criar uma classe em seu aplicativo que tem algum tipo de tempo limite que é redefinir cada vez que o usuário interage com o software. Se o tempo limite é atingido, o usuário é autenticado.

A coisa complicada aqui é detectar interação do usuário. Em ASP.NET é muito fácil, você precisa essencialmente para verificar apenas para pedidos de página. Em um aplicativo Windows Forms terá de entrada montor em um nível muito mais detalhado (pressionar qualquer tecla em qualquer caixa de texto será a interação do usuário, por exemplo). Eu acho que a propriedade VisualizarTeclas juntamente com um ouvinte de evento KeyPress no formulário pode ser um bom caminho a seguir.

Bem, em primeiro lugar, o que você quer dizer com inativos? Na Web você está tentando simular estado onde não existe nenhum. No entanto, em um aplicativo cliente, você obter todos os tipos de eventos, mesmo MouseMove. ideia Onde é que você pode criar UserControls fora dos controles de entrada padrão, como TextBox, Button, e assim por diante e tê-los atualizar algum tipo de objeto temporizador quando os eventos são invocados. A outra é a renunciar o material UserControl e apenas atualizar o timer em cada manipulador de eventos que você criar. Provavelmente seria mais simples apenas para atualizar o temporizador baseado nos eventos MouseMove ou KeyDown no próprio formulário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top