Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Listagem de Bug's
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

Truques de (bom) Tratamento de Erros no ASP.NET

Pesquisa personalizada
Pesquisar Dicas:






Erros em aplicações web podem surgir em diversos pontos, com diversas origens diferentes. Por isso o ASP.NET permite a interceptação dos erros em vários níveis, por controles, por código, por página, pelo web.config e pelo global.asax.

Porém este não é o objetivo deste artigo. Sobre esses itens acima já existem diversos outros artigos na web. Neste artigo vou falar de alguns truques bem específicos com tratamento de erros. Vou demonstra-los em situações bem específicas, mas vocês poderão adapta-los para outros casos que certamente nem imaginei.

São duas situações distintas que irei demonstrar : Primeiramente, o tratamento de erros causados pelo ValidateRequest, o que é um caso muito específico. Em seguida, o tratamento de erros retornados por execuções feitas diretamente pelos objetos datasource, o que é extremamente comum e que com certeza todos vocês precisarão utilizar.

Tratando o ValidateRequest

O ASP.NET por padrão realiza o procedimento de ValidateRequest em todas as idas ao servidor. Nesse procedimento ele verifica se o usuário está enviando para o servidor alguma informação que se pareça com um ataque de HTML Injection ou Script Injection.

Se o ASP.NET achar que sim, ocorre o erro de ValidateRequest, uma grande tela amarela para o usuário.

Porém isso não quer dizer que o usuário tenha tentado invadir seu site. Se for um formulário de contato, por exemplo, o usuário pode inadvertidamente causar um problema ao utilizar, em meio a sua mensagem, símbolos de < e >

Com isso ficamos com a tarefa de interceptar esse possível erro e fazer um tratamento para exibir uma mensagem adequada ao usuário, ao invés da horrenda tela amarela.

O validateRequest pode ser habilitado ou desabilitado em cada página através do atributo ValidateRequest da tag @Page, ou para o site inteiro através da tag <pages> no web.config, mas não é recomendável que seja desabilitado.

Para tratar o erro seria normal pensarmos em utilizar um RegularExpressionValidator para nossos campos, porém seria por demais trabalhoso fazer isso para cada campo de nossa aplicação.

A solução então é interceptar o erro gerado pelo ValidateRequest. Para isso fazemos um tratamento do evento Error da página.

Vamos fazer um passo-a-passo para iniciarmos.

1) Crie um novo WebSite no Visual Studio.

2) Insira uma TextBox, um botão e um label (txtNome, cmdOk, lblResultado, respectivamente)

3) Programe o evento click do botão cmdOk :

Protected Sub cmdOk_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdOk.Click
lblResultado.Text = "Ola " & txtNome.Text
End Sub

Testando

4) Execute a página (botão direito em design, view in browser)

5) Digite um nome e clique no Ok

6) Digite <img src=""> e clique no Ok

O ASP.NET gera o erro devido ao ValidateRequest

7) Desative o ValidateRequest utilizando o atributo na tag @Page

8) Teste novamente, digitando <img src=""> . Apesar de não aparecer imagem alguma, vemos um quadrado, indicando que o HTML está sendo processado pelo browser, o que caracteriza um ataque de HTML Injection.

Tratando o erro

9) Programe o evento Error da página

Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
Dim ex As Exception
ex = Server.GetLastError

If TypeOf ex.GetBaseException Is System.Web.HttpRequestValidationException Then
Response.StatusCode = 200
Response.Write("Você digitou um caracter inválido")
Response.End()
End If
End Sub

Porém isso não resolve o problema. Não resolve porque quando o erro ocorrer será exibida apenas a mensagem de erro, toda a página e seu layout deixarão de ser exibidos, o que não é agradável.

Ocorre que, quando a execução chega no evento Page_Error é porque o processo de execução já foi interrompido, a sequencia de eventos da página foi interrompida devido a um erro. Não tem como, pelo evento page_error, reiniciar esta sequencia para que a renderização da página possa ser montada.

A solução para o problema é fazermos um overrides na função DeterminePostBackMode, que é a função que inicia o processo que irá fazer o validate request. Fazendo este overrides, podemos capturar o erro antes deste acontecer, ou seja, antes da sequencia de eventos da página ser interrompida, nos permitindo mais flexibilidade no tratamento.

Para agradável exibição do erro, nos aproveitamos dos recursos de validação do próprio ASP.NET, utilizando um customValidator e um validationSummary para exibir a mensagem de erro.

Veja como fica :

Public deuerro As Boolean

Protected Overrides Function DeterminePostBackMode() As System.Collections.Specialized.NameValueCollection

Try
Return MyBase.DeterminePostBackMode()
Catch ex As HttpRequestValidationException
Dim col As New NameValueCollection
col.Add(System.Web.HttpContext.Current.Request.Form)
col.Add(System.Web.HttpContext.Current.Request.QueryString)
deuerro = True
Return col
End Try
End Function

De acordo com o processamento normal desta função, a coleção NameValueCollection é retornada com o conteúdo das coleções Request.Form e Request.QueryString. Então tentamos realizar a tarefa normal da função, porém no meio de um tratamento de erro. Se a função retornar um erro de validação de dados (HTTPRequestValidationException) então nós mesmos nos encarregamos de juntar o request.form e request.querystring em uma única namedvalueCollection e devolve-la, mas não sem antes marcarmos um flag indicando que o erro ocorreu.

Ou seja, estamos fazendo com que o ASP.NET ignore os erros de validateRequest (HTTPRequestValidationException), mas nós saberemos quando o erro ocorreu (através do flag, neste exemplo a variável deuerro) e iremos trata-lo.

O customvalidator vai utilizar esse flag para saber que houve erro e exibir a mensagem de erro, da forma mais simples possível :

Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate

args.IsValid = Not deuerro
End Sub

Observe que o customValidator não está de fato validando nada, mas a ligação dele com a variável deuerro fará com que a mensagem do customValidator seja exibida sempre que ocorrer um erro de validateRequest. Da mesma forma o isValid da página ficará como false e nosso código, se bem organizado, saberá que não deve prosseguir.

Desta forma conseguimos facilmente exibir uma mensagem de erro agradável quando ocorrer o erro de validação da requisição.

Tratando erros vindos do banco de dados

Tanto o sqlDataSource como os objetos de dados (gridview, formview, detailsview, etc), possuem eventos terminados em ING e eventos terminados em ED. Os eventos terminados em ING indicam algo que está acontecendo, enquanto que os eventos terminado em ED indicam algo que já aconteceu.

Nos eventos posteriores a ida a banco, terminados em ED, podemos realizar o tratamento de erros vindos do banco de dados. Nos parâmetros do evento recebemos a indicação se ocorreu ou não um erro vindo do banco de dados.

Desta forma, programando os eventos ED podemos realizar o tratamento dos erros vindos do banco. A partir dai podemos utilizar o mesmo truque com o CustomValidator demonstrado no tópico anterior.

Personalizando a Gridview

Por fim, para facilitar ainda mais o trabalho, podemos criar uma gridview personalizada. Nossa gridview personalizada pode conter uma propriedade que defina se ela vai ou não interceptar erros vindos da base de dados.

Podemos chamar a propriedade de InterceptarErros, seria de um tipo Enum podendo conter 3 valores : Não, Mensagem Simples, Validador

 



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

Veja abaixo os comentários já enviados :

Nome : E-Mail :
-1'
Nome : -1' E-Mail :
Nome : E-Mail :
Nome : E-Mail :
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1