Problemas de acesso no Silverlight 3 com WebServices (access denied cross-domain)

Ao executar um componente feito em Silverlight que acesse um dados externo como um WebService ou um componente WCF você poderá receber uma mensagem totalmente insignificante, como abaixo:

"Message: Unhandled Error in Silverlight Application An exception occurred during the operation, making the result invalid.  Check InnerException for exception details.   at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
   at SilverlightApplication1.MeuWS.RetornaPessoaCompletedEventArgs.get_Result()
   at SilverlightApplication1.MainPage.X_RetornaPessoaCompleted(Object sender, RetornaPessoaCompletedEventArgs e)
   at SilverlightApplication1.MeuWS.WSExemplo1SoapClient.OnRetornaPessoaCompleted(Object state)
Line: 1
Char: 1
Code: 0"

Caso voce acesse o InnerException como sugerido na mensagem receberá um erro de access denied por não haver manifesto de confiança cross-domain ou cross-forest.

Este erro acontece porque o Silverlight ao acessar um componente externo precisa que seja confiado para uso naquela URL.

O arquivo ClientAccesspolicy.xml é muito simples e deve estar no mesmo site que o webservice (asmx) está:

<?xml version="1.0" encoding="utf-8"?>  
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="http://*" />
        <domain uri="https://*" />
      </allow-from>  
      <grant-to>
          <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy> 
  </cross-domain-access>
</access-policy>

Note que nas linha 5 inicia uma relação dos sites que podem acessar o webservice em que este arquivo está hosteado. No exemplo acima estamos permitindo qualquer site de utilizar o nosso webservice, mas obviamente você irá montar sua própria lista.

Comentários (2) -

  • Quando estamos trabalhando com dominios diferentes é necesario colocar uma copia do arquivo ClientAccesspolicy.xml na pasta wwwRoot no IS que esta rodando o WCF
  • Isso mesmo Luciano, o arquivo de politicas tem que estar no servidor onde o WCF/Web Service reside para o SilverLight poder acessar.

    Um abraço.
Os comentários estão fechados