Freigeben über


Socket.IO Azure Function-Trigger und -Bindung (Vorschau)

In diesem Artikel wird erläutert, wie Sie die serverlose Integration von Socket.IO in Azure Functions verwenden.

Aktion Bindungstyp
Abrufen des Client-Aushandlungsergebnisses einschließlich URL und Zugriffstoken Eingabebindung
Ausgelöst durch Nachrichten vom Dienst Triggerbindung
Aufrufen des Diensts zum Senden von Nachrichten oder Verwalten von Clients Ausgabebindung

Quellcode | Paket | API-Referenzdokumentation | Produktdokumentation | Beispiele

Wichtig

Bindungen von Azure Function können nur mit Web PubSub für Socket.IO im serverlosen Modus integriert werden.

Authentifizieren und Verbindungszeichenfolge

Damit die Erweiterung mit Web PubSub für Socket.IO funktioniert, müssen Sie entweder Zugriffsschlüssel oder eine identitätsbasierte Konfiguration für die Authentifizierung beim Dienst bereitstellen.

Auf Zugriffsschlüssel basierte Konfiguration

Konfigurationsname Beschreibung
WebPubSubForSocketIOConnectionString Erforderlich. Auf Schlüssel basierte Verbindungszeichenfolge zum Dienst

Sie finden die Verbindungszeichenfolge im Blatt Keys in Web PubSub für Socket.IO im Azure-Portal.

Verwenden Sie für die lokale Entwicklung die Datei local.settings.json, um die Verbindungszeichenfolge zu speichern. Legen Sie WebPubSubForSocketIOConnectionString für die vom vorherigen Schritt kopierte Verbindungszeichenfolge fest:

{
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    `WebPubSubForSocketIOConnectionString`: "Endpoint=https://<webpubsub-name>.webpubsub.azure.com;AccessKey=<access-key>;Version=1.0;"
  }
}

Verwenden Sie bei der Bereitstellung die Anwendungseinstellungen, um die Verbindungszeichenfolge festzulegen.

Auf Identität basierte Konfiguration

Konfigurationsname Beschreibung
WebPubSubForSocketIOConnectionString__endpoint Erforderlich. Der Endpunkt des Diensts. Beispiel: https://mysocketio.webpubsub.azure.com
WebPubSubForSocketIOConnectionString__credential Damit wird festgelegt, wie für die Verbindung ein Token abgerufen werden soll. Diese Einstellung sollte auf managedidentity festgelegt werden, wenn Ihre bereitgestellte Azure-Funktion die Authentifizierung mit verwalteter Identität verwenden soll. Dieser Wert ist nur gültig, wenn eine verwaltete Identität in der Hostingumgebung verfügbar ist.
WebPubSubForSocketIOConnectionString__clientId Wenn credential auf managedidentity festgelegt ist, kann mit dieser Eigenschaft die benutzerseitig zugewiesene Identität angegeben werden, die beim Abrufen eines Tokens verwendet werden soll. Die Eigenschaft akzeptiert eine Client-ID, die einer vom Benutzer zugewiesenen Identität entspricht, die der Anwendung zugeordnet ist. Wenn nichts angegeben wird, wird die vom System zugewiesene Identität verwendet.

Die Funktionsbindung folgt den allgemeinen Eigenschaften für die identitätsbasierte Konfiguration. Weitere nicht erwähnte Eigenschaften finden Sie unter Allgemeine Eigenschaften für identitätsbasierte Verbindungen.

Verwenden Sie für die lokale Entwicklung die Datei local.settings.json, um die Verbindungszeichenfolge zu speichern. Legen Sie WebPubSubForSocketIOConnectionString für die vom vorherigen Schritt kopierte Verbindungszeichenfolge fest:

{
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "WebPubSubForSocketIOConnectionString__endpoint": "https://<webpubsub-name>.webpubsub.azure.com",
    "WebPubSubForSocketIOConnectionString__tenant": "<tenant id you're in>",
  }
}

Wenn Sie die identitätsbasierte Konfiguration verwenden und online ausführen möchten, sollte AzureWebJobsStorage auf Verbinden zum Hostspeicher mit einer Identität verweisen.

Eingabebindung

Die Socket.IO-Eingabebindung generiert SocketIONegotiationResult an die Client-Aushandlungsanforderung. Wenn ein Socket.IO-Client versucht, eine Verbindung mit dem Dienst herzustellen, muss er endpoint, pathund access token für die Authentifizierung kennen. Es ist üblich, einen Server zum Generieren dieser Daten zu verwenden, was als Aushandlung bezeichnet wird.

[FunctionName("SocketIONegotiate")]
public static IActionResult Negotiate(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
    [SocketIONegotiation(Hub = "hub", UserId = "userId")] SocketIONegotiationResult result)
{
    return new OkObjectResult(result);
}

attribute

Das Attribut für die Eingabebindung lautet [SocketIONegotiation].

Attributeigenschaft Beschreibung
Hub Der Hubname, mit dem ein Client eine Verbindung herstellen muss.
Verbindung Der Name der App-Einstellung, die die Socket.IO Verbindungszeichenfolge enthält (Standardwert ist WebPubSubForSocketIOConnectionString).
UserId Die UserId der Verbindung. Er gilt für alle Sockets in der Verbindung. Er wird zum Anspruch sub im generierten Token.

Triggerbindung

Azure Function verwendet Triggerbindung, um eine Funktion zum Verarbeiten der Ereignisse von Web PubSub für Socket.IO auszulösen.

Die Triggerbindung macht einen bestimmten Pfad verfügbar, gefolgt vom Azure Functions-Endpunkt. Die URL sollte als URL-Vorlage des Diensts festgelegt werden (Portal: Einstellungen –> Ereignishandler –> URL-Vorlage). Im Endpunktmuster ist der Abfrageteil code=<API_KEY> aus SicherheitsgründenERFORDERLICH, wenn Sie eine Azure-Funktions-App verwenden. Den Schlüssel finden Sie im Azure-Portal. Suchen Sie nach dem Bereitstellen der Funktions-App in Azure nach Ihrer Funktions-App-Ressource, und navigieren Sie zu Funktionen –>App-Schlüssel –>Systemschlüssel –>socketio_extention. Wenn Sie mit lokalen Funktionen arbeiten, wird dieser Schlüssel jedoch nicht benötigt.

<Function_App_Endpoint>/runtime/webhooks/socketio?code=<API_KEY>

Funktionstrigger für Socket-Verbindungsereignis.

[FunctionName("SocketIOTriggerConnect")]
public static async Task<SocketIOEventHandlerResponse> Connect(
    [SocketIOTrigger("hub", "connect")] SocketIOConnectRequest request)
{
    return new SocketIOConnectResponse();
}

Funktionstrigger für mit Socket verbundenes Ereignis.

[FunctionName("SocketIOTriggerConnected")]
public static async Task Connected(
    [SocketIOTrigger("hub", "connected")] SocketIOConnectedRequest request)
{
}

Funktionstrigger für Socket-Trennungsereignis.

[FunctionName("SocketIOTriggerDisconnected")]
public static async Task Disconnected(
    [SocketIOTrigger("hub", "disconnected")] SocketIODisconnectedRequest request)
{
}

Funktionstrigger für normale Nachrichten von Clients.

[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
    [SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
    [SocketIOParameter] string arg)
{
}

Attribute

Das Attribut für die Triggerbindung lautet [SocketIOTrigger].

Attributeigenschaft Beschreibung
Hub Der Hubname, mit dem ein Client eine Verbindung herstellen muss.
Namespace Der Namespace des Sockets. Standard: „/“
EventName Der Ereignisname, den die Funktion auslöst. Einige Ereignisnamen sind vordefiniert: connect für Socket-Verbindungsereignis. connected für mit Socket verbundenes Ereignis. disconnected für von Socket getrenntes Ereignis. Andere Ereignisse werden von Benutzer*innen definiert und müssen mit dem vom Client gesendeten Ereignisnamen übereinstimmen.
ParameterNames Die Parameternamensliste des Ereignisses. Die Länge der Liste sollte mit dem vom Client gesendeten Ereignis konsistent sein. Der Name verwendet die Bindungsausdrücke und den Zugriff durch den Funktionsparameter mit demselben Namen.

Bindungsdaten

[SocketIOTrigger] bindet einige Variablen an Bindungsdaten. Weitere Informationen hierzu finden Sie unter Azure Functions-Muster für Bindungsausdrücke

SocketIOAttribute

SocketIOAttribute ist eine Alternative von ParameterNames, was die Funktionsdefinition vereinfacht. Die folgenden beiden Definitionen haben beispielsweise dieselbe Wirkung:

[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
    [SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
    [SocketIOParameter] string arg)
{
}
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
    [SocketIOTrigger("hub", "new message", ParameterNames = new[] {"arg"})] SocketIOMessageRequest request,
    string arg)
{
}

Beachten Sie, dass ParameterNames sie [SocketIOParameter] nicht zusammen verwendet werden können.

Anforderung der Eingabebindung

Die Datenstruktur der Eingabebindungsargumente variiert je nach Nachrichtentyp.

Verbinden

{
    "namespace": "",
    "socketId": "",
    "claims": {
        "<claim-type>": [ "<claim-value>" ]
    },
    "query": {
        "<query-key>": [ "<query-value>" ]
    },
    "headers":{
        "<header-name>": [ "<header-value>" ]
    },
    "clientCertificates":{
        {
            "thumbprint": "",
            "content": ""
        }
    }
}
Eigenschaft Beschreibung
Namespace Der Namespace des Sockets.
socketId Die eindeutige Identität des Sockets.
claims Der Anspruch von JWT der Clientverbindung. Beachten Sie, dass es nicht das JWT ist, wenn der Dienst die Funktion anfordert, sondern das JWT, wenn der Engine.IO-Client eine Verbindung mit dem Dienst herstellt.
Abfrage Die Abfrage der Clientverbindung. Beachten Sie, dass es nicht die Abfrage ist, wenn der Dienst die Funktion anfordert, sondern die Abfrage, wenn der Engine.IO-Client eine Verbindung mit dem Dienst herstellt.
headers Die Header der Clientverbindung. Beachten Sie, dass es nicht die Header sind, wenn der Dienst die Funktion anfordert, sondern die Header, wenn der Engine.IO-Client eine Verbindung mit dem Dienst herstellt.
clientCertificates Das Clientzertifikat, wenn es aktiviert ist

Verbunden

{
    "namespace": "",
    "socketId": "",
}
Eigenschaft Beschreibung
Namespace Der Namespace des Sockets.
socketId Die eindeutige Identität des Sockets.

Getrennt

{
    "namespace": "",
    "socketId": "",
    "reason": ""
}
Eigenschaft Beschreibung
Namespace Der Namespace des Sockets.
socketId Die eindeutige Identität des Sockets.
reason Die Beschreibung des Grundes für das Schließen der Verbindung.

Normale Ereignisse

{
    "namespace": "",
    "socketId": "",
    "payload": "",
    "eventName": "",
    "parameters": []
}
Eigenschaft Beschreibung
Namespace Der Namespace des Sockets.
socketId Die eindeutige Identität des Sockets.
payload Die Nachrichtennutzdaten im Engine.IO-Protokoll
eventName Der Ereignisname der Anforderung.
parameters Liste der Parameter der Nachricht.

Ausgabebindung

Die Ausgabebindung unterstützt derzeit die folgenden Funktionalitäten:

  • Hinzufügen eines Sockets zu einem Raum
  • Entfernen eines Sockets von einem Raum
  • Senden von Nachrichten an ein Socket
  • Senden von Nachrichten an einen Raum
  • Senden von Nachrichten an einen Namespace
  • Trennen von Sockets
[FunctionName("SocketIOOutput")]
public static async Task<IActionResult> SocketIOOutput(
    [SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
    [SocketIO(Hub = "hub")] IAsyncCollector<SocketIOAction> collector)
{
    await collector.AddAsync(SocketIOAction.CreateSendToNamespaceAction("new message", new[] { "arguments" }));
}

attribute

Das Attribut für die Eingabebindung lautet [SocketIO].

Attributeigenschaft Beschreibung
Hub Der Hubname, mit dem ein Client eine Verbindung herstellen muss.
Verbindung Der Name der App-Einstellung, die die Socket.IO Verbindungszeichenfolge enthält (Standardwert ist WebPubSubForSocketIOConnectionString).

Aktionen

Die Ausgabebindung verwendet Aktionen zum Ausführen von Vorgängen. Derzeit werden die folgenden Aktionen unterstützt:

AddSocketToRoomAction

{
    "type": "AddSocketToRoom",
    "socketId": "",
    "room": ""
}

RemoveSocketFromRoomAction

{
    "type": "RemoveSocketFromRoom",
    "socketId": "",
    "room": ""
}

SendToNamespaceAction

{
    "type": "SendToNamespace",
    "eventName": "",
    "parameters": [],
    "exceptRooms": []
}

SendToRoomsAction

{
    "type": "SendToRoom",
    "eventName": "",
    "parameters": [],
    "rooms": [],
    "exceptRooms": []
}

SendToSocketAction

{
    "type": "SendToSocket",
    "eventName": "",
    "parameters": [],
    "socketId": ""
}

DisconnectSocketsAction

{
    "type": "DisconnectSockets",
    "rooms": [],
    "closeUnderlyingConnection": false
}