Hospedando um serviço WCF em uma Worker Role do Windows Azure – Utilizando Endpoints Http
Olá pessoal,
Tempos atrás fiz um post sobre como hospedar serviço WCF utilizando uma Worker Role do Windows Azure e neste exemplo era utilizado o protocolo Tcp para publicar um endpoint público do Windows Azure e também para estabelecer a conexão entre o cliente e o serviço.
Entretanto, recebi alguns contatos de pessoas adaptando o exemplo para utilizar o protocolo Http e recebendo mensagens de erro ao abrir o Service Host, a mensagem recebida seguia o padrão abaixo:
“HTTP could not register URL /">/">/">https://+:<Porta>/<Endereço>. Your process does not have access rights to this namespace (see https://go.microsoft.com/fwlink/?LinkId=70353 for details).”
Isso ocorre porque os usuários normais do Windows não possuem permissão para escutar em portas utilizando o protocolo Http, isso é gerenciado pelo driver Http.Sys. Uma das alternativas para contornar esta restrição é explicitamente dar a permissão para o usuário conseguir abrir uma porta específica Http. No mundo Onpremise, isso é feito utilizando o comando netsh.exe como administrador, mas como podemos fazer com um código executando no Windows Azure?
A idéia é exatamente a mesma, lembre-se que as máquinas que executam o seu código no Windows Azure são baseadas no Windows Server 2008 e no Windows Server 2008 R2, desta maneira também podemos executar o comando netsh.exe e permitir a abertura da porta Http.
À partir do Windows Azure SDK 1.3, temos o advento de uma funcionalidade chamada startup task, que é a execução de uma aplicação responsável por instalar e configurar os pré-requisitos necessários da solução e é executada antes que o método RoleEntryPoint.OnStart seja chamado, ou seja, antes que a Worker Role inicie o seu processamento.
Para fazê-la funcionar devemos adicionar um arquivo texto com a extensão .cmd (poderia ser .bat também) no seu projeto, resolvi chamar o meu de AddUrlAcl.cmd, como pode ser visto abaixo:
Depois disso, é necessário ir nas propriedades desse arquivo e modificar o “Copy to Output Directory” para “Copy Always” e o seu conteúdo deve ser:
echo off
netsh http add urlacl url=https://+:1234/ user=\everyone
Importante, notem que configurei a Worker Role para utilizar a porta 1234 no seu endpoint.
Em seguida, devemos adicionar o trecho abaixono arquivo ServiceDefinition.csdef, isso deve ficar dentro da tag WorkerRole:
<Startup>
<Task commandLine="AddUrlAcl.cmd"
executionContext="elevated"
taskType="simple"/>
</Startup>
Agora é só fazer o deploy, façam os testes e me digam se funcionou.
RG