Atualmente, estou arrancando os cabelos no trabalho tentando resolver um problema com um aplicativo da web que usa SignalR sobre WebSockets, onde o tráfego é direcionado por meio de um Barracuda Web Application Firewall (WAF). Cada tentativa de conexão ao signalr/connect
endpoint usando websockets falharia com um 400 Bad Request. A conexão é então revertida para a pesquisa do WebServer, que funciona, mas não é o que desejamos.
As solicitações feitas são enviadas para nosso Barracuda Web Application Firewall e, em seguida, enviadas para nossos servidores Web IIS com balanceamento de carga. Estamos usando o IIS 8.5 no Windows Server 2012R2 e o aplicativo é um aplicativo da Web .Net 4.6.2.
A mesma configuração (sem usar Barracuda WAF) funciona sem problemas.
Até agora eu tenho
Websockets habilitados no WAF conforme este artigohttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Ainda recebo o mesmo erro 400.
Verificado para garantir que meus servidores IIS tenham o WebSocket
recurso habilitado.
Ativado depuração/rastreamento do SignalR no Web.Config conformehttps://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Isso resulta em arquivos de log, mas não indica erros.
Não tenho certeza do que mais verificar?
Responder1
Então descobri meu problema. Descobri que, na verdade, estamos enviando primeiro nosso tráfego para nosso WAF por meio de um Azure Load Balancer. Quando faço logout dos cabeçalhos nos logs de acesso do WAF, vejo que o Connection
cabeçalho não tem valor, o que sei que meu cliente está enviando como Upgrade
.
Parece ser um problema usar um Azure Load Balancer. Então, estou investigando usando um Gateway de Aplicativo do Azure.
No momento, no entanto, posso fazer isso funcionar fazendo com que o WAF adicione o Connection
cabeçalho para mim, configurando uma regra de reescrita de cabeçalho para enviar esse cabeçalho para meus servidores IIS.
Cabeçalhos necessários para WebSockets
Connection: Upgrade Upgrade: websockets
- Abra o site de gerenciamento Barracuda WAF.
- Vá para Site -> Traduções de Sites
Em Reescrita de solicitação HTTP, adicione uma nova regra de reescrita…
- Especifique um nome de regra.
- Defina um número de sequência.
- Selecione Reescrever cabeçalho como a ação.
- Insira Conexão como o nome do cabeçalho.
- Use * como valor antigo, que substituirá qualquer valor.
- Insira upgrade como o valor Rewrite, para que seja enviado.
- Use
Header Upgrade eq websocket
como condição de reescrita. Agora isso só aplicará a regra quando oUpgrade
cabeçalho contiver o valorwebsocket
. - Clique em Adicionar.
Agora, quando tento carregar o aplicativo novamente e boom, conexão bem-sucedida para /signalr/connect com transporte webSockets!
Mais informações estão disponíveis em meupostagem no blog