sexta-feira, 3 de abril de 2009

Troubleshooting - Development Storage e Azure Tables (o problema)

Hoje gastei um bom tempo fazendo troubleshooting de um bug que eu introduzi no meu código, enquanto tentava manipular tabelas no Azure. A coisa começou obscura, através das mensagens de erro eu fui para um caminho ruim e somente depois de muitos testes consegui resolver meu problema e entender melhor alguns detalhes das ferramentas do Azure SDK para desenvolvimento local.

Para me orientar na criação de tabelas no Azure, utilizei o artigo http://blogs.msdn.com/jnak/archive/2008/10/28/walkthrough-simple-table-storage.aspx, de onde fui pegando algumas idéias e montando meu próprio exemplo.

Montei meu exemplo com uma tabela entidade simples e dois botões, responsáveis por inseriam um registro e fazer uma consulta nos registros. Rodei o aplicativo e bang! Apareceu aquela mensagem excelente “The Server encountered na error processing the request. See Server logs for more details”.

clip_image002

Fui então procurar onde ficam os logs do Development Storage e usando o .NET Reflector descobri que ficam no AppData local do usuário. Tarefa que seria mais rápida se eu tivesse lido o comentário do arquivo DevelopmentStorage.exe.Config. “The logs go to LOCALAPPDATA%\DevelopmentStorage\Logs and are named after the date/time when the development storage was started.” :-)

Analisando o diretório, adivinha? Vazio! Então alterei a configuração para trabalhar com o nível de logging detalhado (verbose).

  <system.diagnostics>
<sources>
<source name="System.Net.HttpListener" switchName="detalhado" >
<listeners>
<add name="defaultListener"/>
</listeners>
</source>
</sources>
<switches>
<!-- <add name="default" value="Critical"/> -->
<add name="detalhado" value="Verbose"/>
</switches> (continua...)

Agora sim, reiniciei o development storage para ele utilizar a nova configuração e após reproduzir o erro consegui ver o seguinte (extraí um pedaço do log):

System.Net.HttpListener Information: 0 : [5156] HttpListenerContext#64537591::.ctor(httpListener#6503226 requestBlob=35055504)
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(httpContext#64537591 memoryBlob# 35055504)
System.Net.HttpListener Information: 0 : [5156] Associating HttpListenerRequest#3338611 with HttpListenerContext#64537591
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(httpContext#64537591 RequestUri:http://127.0.0.1:10002/devstoreaccount1/Tabela() Content-Length:0 HTTP Method:GET)
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(HttpListenerRequest Headers: x-ms-date : Fri, 03 Apr 2009 14:30:15 GMT
DataServiceVersion : 1.0;NetFx
MaxDataServiceVersion : 1.0;NetFx
Accept : application/atom+xml,application/xml
Accept-Charset : UTF-8
Authorization : SharedKeyLite devstoreaccount1:5YEL7oTeEAsOtPyqxwBN9P8OBR4cw/DelOyy1Nk9+1M=
Host : 127.0.0.1:10002)

System.Net.HttpListener Warning: 0 : [5156] HttpListener#6503226::HandleAuthentication() - Recebida uma solicitação com um esquema de autenticação sem correspondência ou sem nenhum esquema desse tipo. AuthenticationSchemes:Anonymous, Authorization:SharedKeyLite devstoreaccount1:5YEL7oTeEAsOtPyqxwBN9P8OBR4cw/DelOyy1Nk9+1M=.

System.Net.HttpListener Verbose: 0 : [5156] HttpListener#6503226::EndGetContext(IAsyncResult#26998456)
System.Net.HttpListener Verbose: 0 : [5156] HttpListener#6503226::EndGetContext(HttpListenerContext#64537591 RequestTraceIdentifier#00000000-0000-0000-0500-0080010000f2)

Nota: estou tentando vencer meu preconceito e trabalhar com um SO em português, mas acho que vou acabar vencido nessa disputa...

Pelo log não encontrei nenhum erro, apenas um aviso – em negrito que aponta para um problema de autenticação, no meu entender, claro. Dado que existe uma série de diferenças entre o armazenamento de tabela no Azure e no desenvolvimento local (ref.: http://msdn.microsoft.com/en-us/library/dd320275.aspx), sendo uma delas “The local Table service supports only Shared Key Lite authentication. It does not support Shared Key authentication.”, tudo indicava um problema com o Shared Key Lite.

Com o intuito de confirmar minhas suspeitas, fiz um teste usando o serviço de armazenamento da minha conta no Azure. Diferente do local, onde tenho que usar a ferramenta DevTableGen, adicionei mais um botão à minha aplicação, responsável por criar uma tabela em tempo de execução:

StorageAccountInfo account = StorageAccountInfo.GetDefaultTableStorageAccountFromConfiguration();
TableStorage.CreateTablesFromModel(typeof(ContextoServico), account);
Resultado: tudo funcionando perfeitamente com o armazenamento na nuvem.

Pensei comigo “estou no caminho certo, vamos ver onde está o problema com os mecanismos de segurança do meu armazenamento local”...

Será?

[]s
Luciano Caixeta Moreira
luticm79@hotmail.com

Nenhum comentário:

Postar um comentário