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.

Boot pelo PenDrive no Windows 2003/XP e superiores

Muitas vezes precisamos criar boot por pendrive, como por exemplo, para instalar o SO em um netbook.

Entre com command prompt,  se for no Windows Vista ou no Windows 7 entre como administrador (botão direito no atalho "Abrir como Administrador"):

DiskPart                          (ferramenta de manutenção e configuração de disco)
Listdisk                           (lista os discos fisicos da maquina)
Select disk <Numero>        (seleciona o pendrive, CUIDADO PARA NÃO ESCOLHER O DISCO ERRADO)
Clean                              (apaga todos os dados do disco)
Create partition primary      (cria a partição com todo o tamanho do pendrive)
Select partition 1               (seleciona a partição que acabou de ser criada)
Active                             (ativa a partição criada)
Format fs=ntfs                 (formata o pendrive)
Assign                            (atribui uma letra ao pendrive no Windows Explorer)
Exit                                (sai do utilitário)

Não feche ainda o command prompt, verifique com qual letra o pendrive ficou no Windows Explorer.

Volte ao command prompt e acesse o DVD de instalação do Windows Vista ou do Windows 7 e acesse a pasta boot:

cd\boot                           (diretório de boot do DVD de instalação)
bootsect /nt60 <Letra>:     (copia os arquivos de boot para um windows versão 6.0 ou superior, no caso o Vista ou Windows 7)

Pronto, agora configure o BIOS de sua maquina para dar boot pelo Pendrive ou use a tecla <F8> que em muitos BIOS mostra a lista de boot.

Boot no Windows 7 e Windows 2008 com VHD

A um tempo atrás comentei que o Windows 7 e o Windows 2008 permitiam o uso nativo de discos virtuais (VHD): http://www.marcelosincic.eti.br/Blog/post/Virtual-Hard-Disk-(VHD-e-WIM)-no-Windows-7-e-Windows-2008.aspx

Porem, como fazer boot por eles?

Existem duas formas. A primeira é mais simples, mas cria um boot primario. A segunda é um pouco mais detalhada.

 Segue o primeiro método, passo-a-passo:

  • Siga os passos do post acima para acrescentar o VHD na lista de discos
  • Acesse o command prompt (administrador no Windows 7)
  • Digite a seguencia:
    • cd <letra>:\Windows\System32
      bcdboot <letra>:\Windows

Este método é simples porque acrescenta uma entrada de boot baseada nos dados do diretório windows do VHD.

Segue o segundo método, passo-a-passo:

  • Siga os passos do post acima para acrescentar o VHD na lista de discos
  • Acesse o command prompt (administrador no Windows 7)
  • Digite a seguencia:
    • bcdedit /copy {current} /d “Nome do SO”   (Este comando retorna o CLSID que deve ser usado nos outros comandos)
      bcdedit /set {CLSID} device vhd=[<letra>:]\Arquivo.vhd
      bcdedit /set {CLSID} osdevice vhd=[<letra>:]\Arquivo.vhd
      bcdedit /set {CLSID} detecthal on

Este segundo método primeiro cria um clone do SO que já existe, altera o nome e a localização apontando para o VHD e liga o detector de hardware.

Deletando a entrada no BOOT

Utilize os dois comandos abaixo, o primeiro para descobrir o CLSID e o segundo para deletá-lo:

  • bcdedit (irá listar, veja o que quer deletar e copie o CLSID
  • bcdedit /delete {CLSID}

OBSERVAÇÃO IMPORTANTE:

O fato de VHDs poderem ser criados no VirtualPC, Virtual Server, Hyper-V ou VirtualBox não quer dizer que você pode subir a maquina virtual nestes programas, instalar o SO e depois utilizar para Dual-Boot normalmente. O problema neste caso é que estes virtualizadores trabalham com drivers de hardware "virtuais" o que pode não funcionar na maquina fisica.