Udostępnij za pośrednictwem


Proksy YARP dla WebSockets i SPDY

Wprowadzenie

YARP umożliwia domyślnie proxy'owanie połączeń WebSocket i SPDY. Ta obsługa współpracuje zarówno z bezpośrednim przekazywaniem, jak i z pełnym potokiem.

WebSockets to dwukierunkowy protokół przesyłania strumieniowego oparty na protokole HTTP/1.1 lub nowszym dostosowanym do protokołu HTTP/2.

SPDY jest prekursorem HTTP/2 i jest często używany w środowiskach Kubernetes.

Uaktualnienia HTTP/1.1

Protokoły WebSockets i SPDY są oparte na protokole HTTP/1.1 przy użyciu opcji o nazwie uaktualnień połączeń. YARP pełni funkcję proxy dla początkowego żądania, a jeśli serwer docelowy odpowiada za pomocą 101 Switching Protocols, modernizuje połączenie do nieprzezroczystego, dwukierunkowego strumienia przy użyciu nowego protokołu. Usługa YARP nie obsługuje uaktualniania do innych protokołów, takich jak HTTP/2 w ten sposób.

Protokół HTTP/2

Protokół YARP obsługuje protokołu WebSocket przez protokół HTTP/2 począwszy od platformy .NET 7 i YARP 2.0. Kestrel jest jedynym dostępnym serwerem AspNetCore, który akceptuje przychodzące żądania HTTP/2 WebSocket, a wsparcie jest automatycznie włączone. Przeglądarki mogą wykrywać tę obsługę anonsowaną przez serwer i automatycznie przełączać się na protokół HTTP/2.

Wersje protokołu przychodzącego i wychodzącego nie muszą być zgodne. Przychodzące żądanie protokołu WebSocket może być http/1.1 lub 2. Nie ma żadnej konfiguracji specyficznej dla WebSockets dla żądań wychodzących, usługa YARP będzie używać wersji i polityki wersji ForwarderRequestConfig, aby określić, która wersja ruchu wychodzącego ma być używana. Te wartości domyślne to HTTP/2 i RequestVersionOrLower.

WebSockets wymagają różnych nagłówków HTTP dla protokołu HTTP/2, dlatego YARP doda i usunie te nagłówki w trakcie dostosowywania się do różnych wersji.

Po początkowym nawiązaniu połączenia WebSockets działają tak samo nad obiema wersjami HTTP.

Limit czasu

Limity czasu oczekiwania żądań HTTP (.NET 8+) mogą być stosowane do wszystkich żądań domyślnie lub zgodnie z zasadami. Te limity czasu zostaną wyłączone po negocjacji WebSocket. Będą one nadal stosowane do żądań gRPC. Aby uzyskać dodatkowe informacje na temat konfiguracji, zobacz Limity czasu.