Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
}