Quem já trabalhou com acesso a serviços criados com WCF (Windows Communication Foundation) no Silverlight com certeza já deve ter percebido que quando alguma exceção é lançada no servidor, no lado do cliente (a aplicação Silverlight nesse caso), recebia a seguinte mensagem:

Isso sempre gerava uma enorme dor de cabeça para os desenvolvedores, pois não era trivial saber o que houve de errado.
Mas a partir da versão 3 do Silverlight esse problema pode ser evitado, bastando-se usar o Client HTTP Stack ao invés do Browser HTTP Stack. O Client HTTP Stack usa os serviços HTTP nativos do Sistema Operacional, ao invés da pilha HTTP do browser. Isso irá permitir acessar as informações sobre as SOAP Faults geradas no servidor.
Para utilizar o Client HTTP Stack no Silverlight, basta voce chamar o método RegisterPrefix() da classe WebRequest conforme o código abaixo:
Code Snippet
- public MainPage()
- {
- Boolean registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
- }
Snippet 1: utilizando o Client Http Stack no Silverlight
No código acima, no construtor da nossa MainPage, passamos a utilizar a pilha de rede do SO para requisições HTTP feitas a qualquer serviço cuja URL comece com “http://”.
Agora, na definição dos contratos do nosso serviço, podemos utilizar Fault Contracts e definir os tipos dos erros que serão enviados para o cliente.
Para isso, basta definirmos uma classe que irá guardar as informações dos erros:
Code Snippet
- public class MyServiceFault
- {
- public String ErrorMessage { get; set; }
- }
Snippet 2: Definição do nosso Fault Contract
Em seguida, quando declaramos um método no nosso ServiceContract, basta utilizarmos o atributo FaultContract, passando a classe que irá ser passada ao cliente com as informações dos erros:
Code Snippet
- [OperationContract]
- [FaultContract(typeof(MyServiceFault))]
- public User[] GetUsers()
- {
- //...
- }
Snippet 3: Definição do OperationContract
Agora na aplicação Silverlight conseguimos acessar as informações de possíveis erros que venham a ocorrer no servidor. Basta checarmos o valor da propriedade Error da chamada assíncrona do método do serviço:
Code Snippet
- void OnGetUsersCompleted(object sender, GetUsersCompletedEventArgs e)
- {
- if (e.Error == null)
- {
- // Success
- }
- else if (e.Error is FaultException<MyServiceFault>)
- {
- FaultException<MyServiceFault> fault = e.Error as FaultException<MyServiceFault>;
-
- var errorMessage = fault.ErrorMessage;
-
- MessageBox.Show(errorMessage);
-
- }
- }
Snippet 4: Trantando Faults no Silverilght
Com isso conseguimos ter um acesso melhor as Exceptions que são lançadas no servidor e depurá-las em runtime de maneira mais fácil, sem receber uma mensagem de “Not Found” que não diz absolutamente nada.