Overzicht van WebSocket-ondersteuning in Application Gateway

Application Gateway biedt systeemeigen ondersteuning voor WebSocket in gateways van alle grootten. Er is geen door de gebruiker configureerbare instelling om selectief WebSocket-ondersteuning in of uit te schakelen.

WebSocket protocol gestandaardiseerde in RFC6455 maakt een volledige duplex communicatie tussen een server en een client mogelijk via een langlopende TCP-verbinding. Deze functie maakt een interactievere communicatie mogelijk tussen de webserver en de client, die bidirectioneel kan zijn zonder dat polling is vereist in implementaties op basis van HTTP. WebSocket heeft weinig overhead in tegenstelling tot HTTP en kan dezelfde TCP-verbinding opnieuw gebruiken voor meerdere aanvragen/antwoorden, wat resulteert in een efficiƫnter gebruik van resources. WebSocket-protocollen zijn ontworpen om te werken via traditionele HTTP-poorten van 80 en 443.

U kunt een standaard HTTP-listener blijven gebruiken op poort 80 of 443 om WebSocket-verkeer te ontvangen. WebSocket-verkeer wordt vervolgens doorgestuurd naar de back-endserver waarvoor WebSocket is ingeschakeld met behulp van de juiste back-endpool, zoals opgegeven in regels voor toepassingsgateway. De back-endserver moet reageren op de toepassingsgateway-tests. Deze worden beschreven in het overzichtsgedeelte van de statustest. Statustests voor Application Gateway zijn alleen HTTP/HTTPS. Elke back-endserver moet reageren op HTTP-tests voor de toepassingsgateway om WebSocket-verkeer naar de server te routeren.

Het wordt gebruikt in apps die profiteren van snelle, realtime communicatie, zoals chatten, dashboard en game-apps.

Hoe werkt WebSocket?

Om een WebSocket-verbinding tot stand te brengen, wordt er een specifieke OP HTTP gebaseerde handshake uitgewisseld tussen de client en de server. Als dit lukt, wordt het protocol voor de toepassingslaag bijgewerkt van HTTP naar WebSockets, met behulp van de eerder tot stand gebrachte TCP-verbinding. Zodra dit gebeurt, is HTTP volledig uit de afbeelding; gegevens kunnen worden verzonden of ontvangen met behulp van het WebSocket-protocol door beide eindpunten, totdat de WebSocket-verbinding is gesloten.

Diagram compares a client interacting with a web server, connecting twice to get two replies, with a WebSocket interaction, where a client connects to a server once to get multiple replies.

Notitie

Zoals beschreven, wordt het HTTP-protocol alleen gebruikt om een handshake uit te voeren bij het tot stand brengen van een WebSocket-verbinding. Zodra de handshake is voltooid, wordt een WebSocket-verbinding geopend voor het verzenden van de gegevens en kan de Web Application Firewall (WAF) geen inhoud parseren. Daarom voert WAF geen inspecties uit op dergelijke gegevens.

Configuratie-element Listener

Een bestaande HTTP-listener kan worden gebruikt ter ondersteuning van WebSocket-verkeer. Hier volgt een fragment van een httpListeners-element uit een voorbeeldsjabloonbestand. U hebt zowel HTTP- als HTTPS-listeners nodig om WebSocket te ondersteunen en WebSocket-verkeer te beveiligen. Op dezelfde manier kunt u de portal of Azure PowerShell gebruiken om een toepassingsgateway te maken met listeners op poort 80/443 ter ondersteuning van WebSocket-verkeer.

"httpListeners": [
        {
            "name": "appGatewayHttpsListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/DefaultFrontendPublicIP"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort443'"
                },
                "Protocol": "Https",
                "SslCertificate": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/sslCertificates/appGatewaySslCert1'"
                },
            }
        },
        {
            "name": "appGatewayHttpListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/appGatewayFrontendIP'"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort80'"
                },
                "Protocol": "Http",
            }
        }
    ],

Configuratie van back-endAddressPool, BackendHttpSetting en routeringsregel

Een BackendAddressPool wordt gebruikt voor het definiƫren van een back-endpool met servers met WebSocket ingeschakeld. De backendHttpSetting wordt gedefinieerd met een back-endpoort 80 en 443. De time-outwaarde van de aanvraag in HTTP-Instellingen is ook van toepassing op de WebSocket-sessie. Er is geen wijziging vereist in de routeringsregel, die wordt gebruikt om de juiste listener te koppelen aan de bijbehorende back-endadresgroep.

"requestRoutingRules": [{
    "name": "<ruleName1>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpsListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }
    }

}, {
    "name": "<ruleName2>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }

    }
}]

Notitie

Zorg ervoor dat uw time-outwaarde groter is dan het door de server gedefinieerde ping/pong-interval om time-outfouten te voorkomen voordat een ping vanaf de client wordt verzonden. Een typische waarde voor een WebSocket is 20 seconden, dus een time-outwaarde van 40 seconden zorgt ervoor dat de gateway geen time-outfout verzendt voordat de client een ping verzendt; anders treedt er een 1006-fout op aan de clientzijde.

Back-end met WebSocket ingeschakeld

Uw back-end moet een HTTP/HTTPS-webserver hebben die wordt uitgevoerd op de geconfigureerde poort (meestal 80/443) om WebSocket te laten werken. Deze vereiste is omdat het WebSocket-protocol vereist dat de eerste handshake HTTP is met een upgrade naar het WebSocket-protocol als headerveld. Hier volgt een voorbeeld van een header:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: https://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

Een andere reden hiervoor is dat de back-endtest van application gateway alleen HTTP- en HTTPS-protocollen ondersteunt. Als de back-endserver niet reageert op HTTP- of HTTPS-tests, wordt deze uit de back-endpool gehaald.

Volgende stappen

Nadat u meer hebt geleerd over webSocket-ondersteuning, gaat u naar een toepassingsgateway om aan de slag te gaan met een webtoepassing waarvoor WebSocket is ingeschakeld.