Fazendo solicitações ao host local no aplicativo Serviços de Aplicativo do Azure

8

Tenho um trabalho contínuo na Web que escuta solicitações que contêm informações de diagnóstico.

Para testar a conectividade, tento fazer uma verificação de integridade no meu trabalho na Web, mas não consigo fazer solicitações ao host local por documentação dos serviços de aplicativos do azure.

O código abaixo é o que eu uso para verificar se consigo me conectar a partir do aplicativo que implanto:

    var uri = new Uri("http://localhost:8989/ping");
    var response = await client.GetAsync(uri);

Eu recebo esta exceção:

System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: Unable to connect to the remote server 
---> System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989

O trabalho da Web é instalado por meio de um script de instalação de extensão de site por meio do Kudu (SCM), o que significa que o trabalho da Web é basicamente um processo filho do Kudu (SCM). O aplicativo de trabalho da Web na inicialização se vincula à porta 8989. Iniciando o aplicativo localmente no Windows, posso executar minha verificação de saúde sem problemas.

A documentação do azure app services diz que as solicitações ao host local falharão, a menos que um aplicativo dentro da mesma sandbox seja vinculado à porta ( https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#local-address- pedidos ).

A documentação dos serviços de aplicativos do azure afirma que o Kudu é executado na mesma caixa de proteção do aplicativo principal ( https://github.com/projectkudu/kudu/wiki/Kudu-architecture#security-model ).

Como habilito a comunicação com meu trabalho na Web via http?

De preferência, seria algo que eu poderia fazer a partir de um processo de instalação de extensão de site, mas todas as opções são boas.

Atualização 12-26-2019:

Tentei forçar o SCM e o aplicativo principal a serem executados na mesma sandbox com WEBSITE_DISABLE_SCM_SEPARATION=true( https://github.com/projectkudu/kudu/wiki/Configurable-settings#use-the-same-process-for-the-user- site-e-o-scm-site ).

A documentação afirma que eles já são executados na mesma caixa de proteção e que, se um processo escutar em uma porta na mesma caixa de proteção, essas solicitações deverão funcionar. Observe que o processo real do SCM w3wp.exe conseguiu acessar o host local com http para o meu trabalho na web. Essa configuração não parece melhorar a situação.

Atualização 04-02-2020:

Abandonei oficialmente a idéia de usar um trabalho na Web e agora inicio o processo como um filho da instância principal do aplicativo. Isso me permite comunicar localhost:8989sem problemas.

Embora agora eu precise gerenciar minha própria lógica de manter viva.

Eu ainda adoraria saber se existe uma maneira de se comunicar via TCP com um trabalho na Web, se isso for possível.

colin-higgins
fonte
Esta é a pergunta mais semelhante que eu encontrei: stackoverflow.com/questions/56572039/…
colin-higgins
O problema de acesso pode estar relacionado à autenticação / autorização do Kudu. Compartilhe os detalhes da criação da instância do cliente.
Igwe Kalu
Isso ocorre antes que a solicitação saia do contexto do aplicativo
colin-higgins
1
Como sugeri na minha resposta, as conexões de soquete não estão ativadas, WebJobspois são executadas dentro de um IHostcontêiner. Detalhes adicionais estão disponíveis na minha resposta.
Igwe Kalu
1
A documentação do Wiki no GitHub nem sempre está atualizada. Nem documentação oficial também. Eu questiono se isso deve funcionar ...
Sean Feldman

Respostas:

0

Como habilito a comunicação com meu trabalho na Web via http?

Não. Não é possível para o WebJob enviar solicitações diretamente para o site via host local . Essa limitação está documentada na página da sandbox como você forneceu.

As tentativas de conexão com endereços locais (por exemplo, localhost, 127.0.0.1) e o próprio IP da máquina falharão, exceto se outro processo na mesma sandbox tiver criado um soquete de escuta na porta de destino.

Tentativas de conexão rejeitadas, como o exemplo a seguir, que tenta se conectar a 127.0.0.1:80, do .NET resultarão na exceção acima.

Para mais detalhes, você pode consultar este tópico SO .

Joey Cai
fonte
Você diz que o trabalho na Web não pode enviar solicitações para o site, mas eu quero a direção oposta. Além disso, "exceto se outro processo na mesma sandbox tiver criado um soquete de escuta na porta de destino" me leva a acreditar que isso é possível.
Colin-higgins
0

Acredito que o problema esteja relacionado à porta atribuída ao seu aplicativo (8989). Você precisará usar outro serviço (serviços antigos na nuvem), máquina virtual ou Service Fabric para abrir e receber solicitações na porta 8989.

Mais informações sobre isso:

Escuta do ponto de extremidade da rede A única maneira de acessar um aplicativo

via Internet, através das portas HTTP (80) e HTTPS (443) já expostas; os aplicativos podem não escutar em outras portas os pacotes que chegam da Internet. No entanto, os aplicativos podem criar um soquete que pode escutar as conexões de dentro da sandbox. Por exemplo, dois processos dentro do mesmo aplicativo podem se comunicar via soquetes TCP; as tentativas de conexão recebidas de fora da caixa de areia, embora estejam na mesma máquina, falharão. Consulte o próximo tópico para obter detalhes adicionais.

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox

Thiago Custodio
fonte
Também não funcionou se eu escolhesse dinamicamente uma porta livre.
colin-higgins
0

Você não deve implementar um servidor HTTP no seu WebJob, pois não é assim que eles devem ser executados.

Um WebJob é basicamente executado dentro de um contêiner IHost projetado para serviços sem cabeça que podem facilitar as tarefas de processamento em segundo plano. Ao contrário de um IWebHost , um IHost não é adequado para hospedagem na web.

Conseqüentemente, o WebJob no seu criado pode não ter se vinculado efetivamente à porta que você mencionou. Nesse caso, é muito provável que a política de segurança da sandbox restrinja o acesso a soquetes arbitrários criados por um usuário que não aqueles expostos para acessar o site e o serviço kudu. Isso foi indicado exatamente por " System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989" no snippet de rastreamento da pilha de erros que você compartilhou.

Como habilito a comunicação com meu trabalho na Web via http? - A comunicação com um WebJob pode ser estabelecida por meio da API WebJobs .

Pode ser necessário criar vários WebJobs para atender às várias funcionalidades pretendidas pela tentativa de implementação do servidor HTTP.

Referências

Igwe Kalu
fonte