Primeiro post de 2011! Bom deixa eu antes desejar a todos os leitores um grande ano com muitas conquistas e felicidades, esse ano promete ein!
Para o assunto deste post vou abordar um pequeno problema que encontrei em meu dia-a-dia de desenvolvedor, o cenário é o seguinte, ao publicar para produção um sistema desenvolvido e ativar o log de mensagens de erro da aplicação comecei a receber diversos avisos deste tipo:
Server Error in '/' Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.
Requested URL: /WebResource.axd
Ok, nosso sistema utiliza diversas bibliotecas de controles como Ajax Control Toolkit, controles desenvolvidos por nós mesmos, bibliotecas de validação, entre outras, todos adicionando suas referencias a JavaScript/CSS/Imagens nas páginas passando pelo WebResource.axd urls encriptadas. Agora como saber quais são estes arquivos que estão sendo solicitados e encontrar o causador ou os causadores de problemas? Após um pequeno periodo pensando como desencriptar tais resources afim de resolver o problema, pesquisando algoritmos para realizar tal operação sem sucesso, foi então que surgiu a idéia “Opa, como o framework faz isto e busca o arquivo para retornar ao usuário?” foi então que após uma outra pesquisada descobri que a própria classe Page (System.Web.UI) possui um método chamado DecryptString usado para desencriptar os resources, “ótimo” deve estar pensando você, basta chamar este método e passar a url e está resolvido. Infelizmente não foi tão simples assim porque tal método até por segurança do framework possui o modificador private internal e foi ai que surgiu uma idéia perigosa “Reflection!” ótimo, um pouquinho de código e estamos prontos para “burlar” os modificadores de acesso e invocar tal método:
System.Reflection.MethodInfo decrypter = typeof(System.Web.UI.Page).GetMethod("DecryptString", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); decrypter.Invoke(null, new object[] { resource }) as string;
Perfeito porém perigoso, mais como será um uso pontual e não permanente no sistema está ótimo, até agora conseguimos acesso ao método e supostamente desencriptar qualquer resource recebido, próximo passo é resolver o problema que apenas ocorria em ambiente de produção, esta parte foi simples, bastou adicionar um pequeno trexo no arquivo Global.asax e interceptar todas as requisições a scripts AXD encriptados, em seguida, desencriptar os mesmos e persistir em um arquivo de texto para posterior conferência. Deixo abaixo o código final para quem possa ser útil:
protected void Application_BeginRequest(object sender, EventArgs e) { if (Request.Path.ToLower().Contains(".axd")) { System.Reflection.MethodInfo decrypter = typeof(System.Web.UI.Page).GetMethod("DecryptString", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); string decryptResource = decrypter.Invoke(null, new object[] { Request.QueryString[0] }) as string;
using (StreamWriter logWriter = File.AppendText(@"C:\LogResources.txt")) { logWriter.WriteLine(string.Format("Request: {0}", Request.Url)); logWriter.WriteLine(string.Format("Resource: {0}{1}", decryptResource, Environment.NewLine)); logWriter.Flush(); } } }
Por fim teremos um resultado como demonstro ao final deste post e o problema foi resolvido, descoberto qual era o JavaScript que não estava sendo encontrado em um dos componentes desenvolvidos internamente, este foi adicionado e sem mais logs de erro.
Request:http://localhost:8988/ScriptResource.axd?d=SrZH9-4Isg-NAqBq8yWrNRnp34xITrUZuNm4IBv339RYmO1cI0UwWdQn633PMBmq4BZZOeovHwzGvGybPFrFskG62PGue1bgzM-_mP-0WUzDpbECYCexsYzMyX2uAoXhfLm5yBrLABi43VfM815DyA2&t=ffffffffbd2983fc
Resource: ZAjaxControlToolkit|MicrosoftAjaxWebForms.debug.js|
Request:http://localhost:8988/ScriptResource.axd?d=y-j1i-XIxMTkLgkn_PpO8XPN9C90ktyk4wGeo6T4bRWOAWqAaGLMpB6sY8jJJvZ4Vurn_-5K3EOvLMcFyTFg0Ce4nKud3ugO5kWXIKSyVikEJbjOgceWDLO5fAxeM1du83YkidWWGOh1aFD04H3q6w2&t=ffffffffbd2983fc
Resource: ZAjaxControlToolkit|MicrosoftAjax.debug.js|
Um abraço e novamente um Feliz 2011 a todos, primeiro de muitos!
Bom dia pessoal, é com grande felicidade que venho anunciar oficialmente que acabo de obter o título e competências de MCT (Microsoft Certified Trainer). Primeiro vou deixar meus agradecimentos especiais ao Márcio Rossato, Edson Dewes e em especial para Roseli por me auxiliar durante todo processo de inscrição e obtenção.
Fala pessoal, venho hoje divulgar rapidinho dois grandes eventos que iniciaram suas inscrições, 2010 é O ano pelo jeito ein! Muitos eventos Microsoft rolando, comunidade mandando ver!
Agora rapidinho sobre o Microsoft Students to Business, este já é um velho conhecido de todos, é um programa de capacitação com apoio da Microsoft e realizado pelo Centro de Inovação aqui de Curitiba com propósito de capacitar proficionais para entrada no mercado de trabalho. Eu realizei a um bom tempo atrás (3 anos), já fui instrutor em uma das edições e sigo recomendando fortemente, a seguir flyer de divulgação desta nova edição.




