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:

clip_image002

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