terça-feira, 3 de fevereiro de 2009

A saga do Oracle com Windows 2003 64bits e o Mono para experimentações

A situação ainda era triste (bom, ainda é), o desenvolvimento do sistema precisava e estava sendo realizado com o Visual Web Developer 2008 Express Edition (VWD), a única coisa com licença para desenvolver asp.net aqui na empresa.
Tudo ocorria tranquilo em minha máquina de desenvolvimento, uma estação windows xp 32bits. Para acesso ao servidor Oracle resolvi utilizar ODP.NET em meus DAOs e o sistema corria bem no servidor embutido do VWD.
Quando resolvi por o sistema em produção em um servidor Windows 2003 64bits com IIS 6, qual não foi a ingrata surpresa de saber que o deploy não ocorerria assim tão fácil, pois de cara, este servidor não tinha suporte a asp.net 2.0. Pois bem, instalamos o abençoado .net 3.5 neste servidor, acreditando que meus problemas estaria acabados, mas não mudou em nada o ambiente. Pesquisando descobri que deveria rodar o aspreg_iis.exe -i para "registrar" o asp.net 2.0 no IIS6.
Legal! Estava registrado e a aplicação agora rodava mas de pronto já berrava exceções referente a impossibilidade de conseguir carregar dll referente ao Oracle. Aí sim que a batalha foi terrível. Como o servidor é 64 bits achamos que o .net deveria ser de 64bits também, mas em lugar algum diz que o .net 3.5 é 32 e 64 bits, então removemos e instalamos o .net 2.0 64bits, afinal o asp.net do .net 3.5 ainda é 2.0.
De nada adiantou as exceções agora só eram diferentes e não permitiam saber exatamente o que estava ocorrendo a não ser pela indicação BadFormatException.
Certamente, então, deveria ser o ODP.NET instalado que não era de 64bits, corremos e instalamos a versão 64bits destes componentes, como podem imaginar, nada de diferente exceções e exceções. Alguns comentários pela web a fora sugeriam que o sistema deveria ser compilado forçadamente como 32 bits e para isto o VWD não servia, pois não dá a opções de escolher o target 32 bits.
A esta altura já estava quase desistindo de utilizar o IIS6 do Windows 2003 64bits para rodar a aplicação. Como tenho meu amado e idolatrado Debian rodando virtualizado com VirtualBox baixei e compilei o mono 2.0 e depois instalei o cliente Oracle. Foi mais fácil executar a aplicação no mono com apache do que no .net com IIS, mas era certo que as exceções referentes ao Oracle continuariam a ocorrer, ou então outras distintas pois até o momento em que pesquisava não encontrara o ODP.NET para mono.
Resolvi mudar meus DAOs e não mais utilizar ODP, passei a utilizar o provider embutido no .net. Já que assim estava, atirei a aplicação no servidor Windows para experimentar, mas não teve jeito, aí passaram a ocorrer outras exceções distintas referente à falta de suporte ao cliente Oracle que fosse inferior a versão 8 ponto alguma coisa.
Atirei a aplicação no mono e bala, rodou tranquilo, pelo menos a princípio, algumas vezes ocorriam algumas exceções estranhas referente à acesso aos dados.
Mas eu ainda estava com gana de colocar o sistema a rodar no Windows 2003, pois afinal é nosso ambiente oficial de execução e eu certamente não teria autorização para alocar a aplicação em um servidor de aplicação linux com mono que nem existe na empresa.
Bom, neste momento a coisa foi uma doidura só experimentamos diversas configurações e versões de ODP.NET de 32 e 64 bits, .net em 32 e 64bits. Nesta altura já tinha voltado meus dados para utilizar ODP.NET.
Em alguma momento conseguimos descobrir que o famigerado IIS 6 roda em 32 bits. Esta "descoberta" foi para alimentar a escalada final da decepção com este servidor. Não dava pra acreditar que o servidor web oficial e nativo do servidor Windows 64bits rodava em 32bits!
Finalmente deixamos tudo em 32 bits, .net e odp.net e conseguimos correr a aplicação tranquilamente.

2 comentários:

Sandro disse...

Na verdade o IIS 64 bits tem a opção de rodar aplicações 32bits, para isto execute o seguinte comando na pasta C:\Inetpub\Adminscripts

cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 1

marcelão disse...

você utilizou qual tipo de acesso com o mono? em qual framework?
estou tentando uma aplicação web, acessando oracle, mas como não tem odp ainda para mono, não tenho solução