Implementação .NET do pattern SynchronizerToken
José estava fazendo compras on-line, ele clicou o botão Submit para fazer um pedido, como não teve nenhuma resposta durante 5 segundos, ele pensou que algo tinha dado errado e clicou no botão novamente! O que aconteceu?
José provavelmente foi cobrado duas vezes!! Isto só porque ele não conseguiu receber a resposta por qualquer razão, porém o servidor recebeu dois pedidos e os duplicou.
A seguir, temos uma solução que pode impedir tal tipo de enganos.
Basicamente, é uma implementação .NET do SynchronizerToken pattern, que foi utilizado no mundo Java durante anos.
Usando o código
É bem fácil de usar:
1. Adicionamos ao projeto, uma referência ao assembly SynchronizerToken;
2. Herdamos a página do Synchronizer;
3. Adicionamos o atributo [OneSubmitOnly] logo antes da page class.
// Mensagem padrao que serah exibida quando acontecer submissao duplicada
// caso a propriedade RedirectURL nao esteja corretamente configurada.
//[OneSubmitOnly]
// a solicitacao (Request) serah redirecionada para ErrorPage.aspx
// quando acontecer submissao duplicada.
[OneSubmitOnly(RedirectURL = "~/ErrorPage.aspx")]
public class WebForm1 : Synchronizer
{
.......
}
Aspectos Interessantes
O atributo OneSumbmitOnly possui a propriedade opcional RedirectURL, que aponta para uma URL válida para onde um pedido é redirecionado quando acontecer a submissão duplicada. Se nenhuma propriedade RedirectURL for configurada, o pedido é rejeitado e a mensagem padrão será exibida.
O evento Resubmission é verificado antes de qualquer evento de subclasse.
Conclusões
Achamos um modo de fazer com que a verificação de resubmission, aconteça antes de qualquer evento de subclasse, sobrepondo o tratador do evento OnLoad. Assim, não teremos nenhuma preocupação a respeito de coisas sem importância, que acontecem no método subclasse de Page_OnLoad, antes da verificação do resubmission.