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.