Share via


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 vergelijkt een client die communiceert met een webserver en maakt twee keer verbinding om twee antwoorden te krijgen, met een WebSocket-interactie, waarbij een client eenmaal verbinding maakt met een server om meerdere antwoorden te krijgen.

Notitie

Nadat een verbinding is bijgewerkt naar WebSocket, als tussenliggende/afsluitproxy, verzendt Application Gateway eenvoudig de gegevens die van de front-end naar de back-end zijn ontvangen en vice versa, zonder inspectie- of manipulatiemogelijkheden. De Web Application Firewall (WAF) kan daarom geen inhoud parseren en voert geen inspecties uit op dergelijke gegevens. Op dezelfde manier zijn bewerkingen zoals herschrijven van headers, URL-herschrijven of overschrijven van hostnaam in de back-endinstellingen niet van toepassing na het tot stand brengen van een WebSocket-verbinding.

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.