Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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