ASP.NET Core + ngrok: expondo na Internet aplicações executadas localmente
Ao trabalharmos com aplicações ASP.NET Core localmente podemos facilmente selecionar a porta em que as mesmas serão executadas, com isto acontecendo através de ajustes em arquivos de configuração ou via parametrização com o comando dotnet run. Abordei inclusive essa segunda opção recentemente no seguinte artigo:
ASP.NET Core: definindo a porta de execução via dotnet run
Mas e se fosse possível expormos essas aplicações executadas em ambientes locais também na Internet, sem as complicações típicas de infraestrutura para situações como essas (certificados, firewalls, ajustes em servidores…) e viabilizando com isso testes simples? Poderíamos assim validar o comportamento de nossos projetos mais rapidamente, além de conduzir provas de conceito (PoCs) sem a necessidade de criação de recursos em nuvem ou até mesmo nos valendo de servidores on-premise. Existe realmente uma alternativa para isto?
A resposta a tais questionamentos está na ferramenta de linha de comando ngrok. Trata-se de uma alternativa que pode ser utilizada gratuitamente, expondo uma aplicação local com segurança na Internet. O ngrok também conta com vários planos de utilização, em que diferentes faixas de valores oferecem capacidades adicionais em relação ao modo básico. O próprio site desta solução destaca que a concessão gratuita deve ser utilizada para cenários mais simples, evitando o processamento de grandes volumes de transações em uma Web App.
Neste artigo demonstrarei como configurar o ngrok em um ambiente Windows, muito embora esta solução também ofereça o suporte a Linux, macOS e containers Docker. Na sequência demonstrarei ainda como utilizar o ngrok em conjunto com uma aplicação ASP.NET Core, executando a mesma localmente com o comando dotnet run e liberando seu acesso a partir da Internet.
E aproveito este espaço para um convite…
Dia 10/01/2022 (segunda) às 21:00 — horário de Brasília — teremos mais um evento online e gratuito no canal Canal .NET.
Será uma live em que apresentarei exemplos utilizando vários frameworks e a integração com soluções como o Azure DevOps, bem como novidades do .NET 6 e orientações sobre como automatizar os testes, o build e o deployment de seus projetos.
Para participar faça sua inscrição no link a seguir, a transmissão acontecerá via YouTube:
Instalando e configurando o ngrok
Para instalar rapidamente o ngrok em Windows podemos utilizar o gerenciador de pacotes Chocolatey, executando para isso a instrução:
choco install ngrok
Uma conta deverá então ser criada no site do ngrok:
Concluído este procedimento, o próximo passo será registrar o token disponibilizado pelo ngrok:
Por meio do comando:
ngrok authtoken <TOKEN DE AUTENTICAÇÃO>
Testando a aplicação ASP.NET Core
Para testar o ngrok com o ASP.NET Core disponibilizei uma aplicação genérica baseada no .NET 6 e voltada ao monitoramento/recebimento de dados de Webhooks no GitHub:
https://github.com/renatogroffe/ASPNETCore6-REST_API-Logging-MonitoramentoWebhooks
Estamos falando basicamente de uma API REST com um Controller simples para recebimento dos dados via POST, com o logging dos dados que chegam e a possibilidade ainda de se consultar o último evento processado:
Com a instrução a seguir executaremos a aplicação na porta 5000:
dotnet run urls=http://localhost:5000
Associaremos então esta porta ao ngrok com o comando:
ngrok http http://localhost:5000
Em Forwarding teremos o endereço gerado pelo ngrok para o acesso à aplicação local a partir da Internet:
Podemos utilizar este endereço para configurar o campo Payload URL de um repositório, como no exemplo a seguir:
https://6500-2804-431-e7c1-d1b4-88f8-55bb-7fba-338c.ngrok.io/webhookmonitor
Enviando todos dados de todos os eventos de um repositório no formato JSON, como indicado na próxima imagem (opção Send me everything):
Após estes ajustes um primeiro evento será recebido pela Web App:
E na próxima animação temos um exemplo de que o GitHub está se comunicando com nossa aplicação executada localmente, com o envio dos dados de uma nova issue aberta no repositório:
O log para este exemplo no Windows Terminal mostrará que o evento foi devidamente processado:
Podemos também acessar o Swagger para esta API REST via browser, simulando um acesso externo:
https://6500-2804-431-e7c1-d1b4-88f8-55bb-7fba-338c.ngrok.io/swagger/index.html
O comportamento aqui será o mesmo de uma aplicação hospedada em uma solução na nuvem:
Um detalhe interessante é que o ngrok também disponibiliza uma web interface, disponível em:
http://127.0.0.1:4040
Permitindo assim que se analisem as requisições HTTP processadas pela aplicação que foi exposta: