Migrando uma aplicação ASP.NET MVC 3 para Windows Azure

Olá pessoal,

Continuando com o tema sobre migração de aplicações para Windows Azure, neste post vou falar um pouco sobre a migração de uma aplicação ASP.NET MVC 3 para Windows Azure. No processo de migração, alguns passos extras são necessários, pois, nativamente os SDKs do Windows Azure (pelo menos até a versão 1.4.1, a mais atual da data de escrita deste post) suportam somente a versão 2.0 do ASP.NET MVC.

O procedimento inicial de migração é bem similar aos passos feitos na migração de uma web application ASP.NET, resumidamente:

  • Adicionar um projeto vazio de Windows Azure na solução;
  • Adicionar referências para os assemblies do Windows Azure no projeto ASP.NET;
  • Adicionar uma classe que herde de RoleEntryPoint no projeto ASP.NET;
  • Associar uma Web Role com o projeto ASP.NET existente.

Depois disso, é necessário adicionar os assemblies do ASP.NET MVC 3 na sua solução antes de fazer o deploy, na verdade mesmo em um ambiente onpremise sem o ASP.NET MVC 3 instalado você pode reproduzir algumas das técnicas abaixo.

Técnica 1 – Adicionar manualmente referências para os assemblies na sua aplicação

Para todos os assemblies do ASP.NET MVC 3 você precisa adicionar uma referência na sua aplicação e escolher a opção “Copy Local = True” nas propriedades do assembly.

  • Microsoft.Web.Infrastructure
  • System.Web.Helpers
  • System.Web.Mvc
  • System.Web.Razor
  • System.Web.WebPages
  • System.Web.WebPages.Deployment
  • System.Web.WebPages.Razor

É importante notar que um projeto ASP.NET MVC 3 já traz referências para a maioria dos assemblies acima, mas não para todos. Você precisa manualmente adicionar os assemblies faltantes.

Técnica 2 – Adicionar via ferramenta referências para os assemblies na sua aplicação

O ASP.NET MVC 3 Tools Update instalado traz uma novidade no Visual Studio 2010 para adicionar as referências para o ASP.NET MVC 3 via ferramenta. Para isso clique com o botão direito no seu projeto MVC e escolha a opção “Add Deployable Dependencies…” e escolha o que vc precisa.

image

2

Técnica 3 – Instalar o ASP.NET MVC 3 através de seu setup utilizando uma startup task

Eu gosto de organizar minhas startup tasks em uma pasta chamada startup dentro das minhas roles, nesta pasta eu geralmente adiciono o setup necessário e um arquivo do tipo batch (detalhe importante: o batch precisa ser salvo no formato ANSI) para iniciar o setup com todos os parâmetros e ambos precisam ter a propriedade “Copy to Output Directory = Copy always” definida. Neste caso o setup é o setup do ASP.NET MVC 3, e o meu batch chamei de InstallMVC.cmd, cujo conteúdo está abaixo:

%~dp0AspNetMVC3Setup.exe /q /log %~dp0mvc3_install.htm
exit /b 0

Na sintaxe batch o termo “%~dp0” indica o diretório corrente e os outros parâmetros indicam com o ASP.NET MVC 3 deve ser instalado. Note o “/q” indicando o uso de “Quiet Mode” para não exibir interface com o usuário. Afinal, ninguém vai clicar next, next e finish pra você no Windows Azure.

O último passo é configurar o arquivo ServiceDefinition.csdef para chamar o InstallMVC.cmd.

 <WebRole name="MvcApplication3">
  <Startup>
    <Task commandLine="Startup\InstallMVC.cmd" executionContext="elevated" />
  </Startup>

Técnica 4 – Instalar o ASP.NET MVC 3 através do WebPI utilizando uma startup task

Muita gente não sabe, mas existe uma versão do Web Platform Installer (WebPI) para rodar em linha de comando, é o chamado WebPICmdLine. Ele pode ser utilizado para instalar aplicações e componentes de maneira similar à versão visual do WebPI. Depois de feito o download, extraia o conteúdo do pacote e adicione os 3 arquivos .dll e o arquivo .exe na pasta startup, de maneira similar à técnica 3 (lembre-se de modificar a propriedade “Copy to Output Directory = Copy always” para todos os arquivos.

Depois o arquivo batch que será chamado como uma startup task deverá ter o seguinte conteúdo:

md "%~dp0appdata"

reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f

"%~dp0webpicmdline" /AcceptEula /Products:MVC3 >>log.txt 2>>err.txt

reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f

exit /b 0

O conteúdo deve ser executado em 5 linhas no total, por favor, corrija as quebras de linha manualmente.

Em uma primeira impressão pode ser complicado entender o script acima, em linhas gerais ele modifica o endereço do “Local AppData” do usuário, executa a instalação e depois retorna o “Local AppData” para o local padrão.

Toda essa alteração é necessária por uma combinação de fatores: uma startup task rodando de maneira elevada é executada como Local System Account e o local do perfil deste usuário fica na pasta System32. O WebPICmdLine está compilado para Any CPU e no Windows Azure será executado como 64bits (lembrete: todas as máquinas do Windows Azure executam como 64 bits) mas o setup do ASP.NET MVC3, que o WebPI faz download e salva na pasta do perfil do usuário, executa como 32bits. Em um ambiente 64bits um processo 32bits não enxerga a pasta System32, somente a pasta SysWOW64. Logo, quando o setup do ASP.NET MVC3 for executado ele não consegue se encontrar para extrair o conteúdo que precisa ser instalado e acaba falhando. Mudando a pasta “Local AppData” todo mundo consegue se enxergar e a coisa toda funciona \o/.