Decifrando a NullReferenceException ou erros do ciclo de referência de ligação no Windows Phone 7.1
Artigo original publicado no domingo, 15 de janeiro de 2012
Recentemente, encontrei um problema muito difícil para diagnosticar e corrigir e não o encontrei em nenhum lugar; então, achei que deveria escrever sobre ele aqui, caso ele incomode outras pessoas. No aplicativo Windows Phone 7.1 (i.e. Mango), você tem uma referência de serviço – no meu caso, um aplicativo WCF. Eu vi que aleatoriamente, ocorria com uma exceção ao criar o proxy do WCF. Esta é a linha do código:
MyService.MyClass foo = new MyService.MyClass("myConfigSettings");
Isso gera uma exceção. E embora seja estranho, o mais confuso e frustrante é que a exceção nem sempre é gerada do mesmo ou jeito. Ele gera uma de duas exceções - não há motivo quando:
- NullReferenceException - absolutamente nenhum detalhe aqui, nenhuma mensagem, exceção interna, nada.
- Um ciclo de referência de ligação foi detectado na sua configuração. O seguinte ciclo de referência deve ser removido: basicHttpBinding/BasicHttpBinding_IMyAppInterface
Uma das (muitas) coisas estranhas é que a exceção só era gerada quando o método era invocado de algum código executado durante a inicialização do aplicativo; invocar esse outro método a qualquer outro momento não causa problemas. Além disso, se você apenas pegar o código de manipulação da exceção e depois arrastar a próxima linha do backup de execução para criar a instância do proxy, sempre funciona. Existem outras coisas realmente estranhas e esquisitas com graus variados de sucesso, mas o que me deu a dica foi o fato de que no código de inicialização do aplicativo, havia outro pedaço do código que executava e também criava uma instância daquele proxy do WCF e NUNCA falhava. Portanto, ao tentar descobrir por que um deles sempre funcionava e o outro falhava, finalmente me ocorreu examinar como o código estava sendo invocado. No fim, dois segmentos diferentes estavam sendo criados no plano de fundo, cada um executando um pedaço diferente do código. Cada segmento chamava métodos diferentes que continham um código que criaria uma instância do proxy WCF. Bem, no final esse era o defeito e a causa do pequeno problema. Reconfigurando o código para que todas as tarefas de inicialização do aplicativo executassem em um único segmento no plano de fundo, as exceções estranhas desapareceram magicamente.
Obviamente, foi pura sorte ter descoberto isso (junto com muitas tentativas e erros), então pensei em compartilhar esta joia caso você tenha um problema semelhante.
Este é um post de um blog localizado. Encontre o artigo original em Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1