Partager via


Socket.IO déclencheur et liaison de fonction Azure (préversion)

Cet article explique comment utiliser Socket.IO intégration serverless à Azure Functions.

Action Type de liaison
Obtenir le résultat de négociation du client, y compris l’URL et le jeton d’accès Liaison d’entrée
Déclenché par des messages du service Liaison de déclencheur
Appeler le service pour envoyer des messages ou gérer des clients Liaison de sortie

Code source | Package | Documentation de référence de l’API | Documentation du produit | Exemples

Important

Les liaisons de fonction Azure peuvent uniquement s’intégrer à Web PubSub pour Socket.IO en mode serverless.

Authentifier et connecter une chaîne

Pour permettre à l’extension de fonctionner avec Web PubSub pour Socket.IO, vous devez fournir des clés d’accès ou une configuration basée sur l’identité pour s’authentifier auprès du service.

Configuration basée sur les clés d’accès

Nom de la configuration Description
WebPubSubForSocketIOConnectionString Obligatoire. Chaîne de connexion basée sur des clés au service

Vous trouverez la chaîne de connexion dans le panneau Clés dans web PubSub pour Socket.IO dans le portail Azure.

Pour le développement local, utilisez le fichier local.settings.json pour stocker la chaîne de connexion. Définissez WebPubSubForSocketIOConnectionString à la chaîne de connexion copiée à l’étape précédente :

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

Lors du déploiement, utilisez les paramètres de l’application pour définir la chaîne de connexion.

Configuration basée sur l’identité

Nom de la configuration Description
WebPubSubForSocketIOConnectionString__endpoint Obligatoire. Point de terminaison du service. Par exemple, https://mysocketio.webpubsub.azure.com
WebPubSubForSocketIOConnectionString__credential Définit la façon dont un jeton doit être obtenu pour la connexion. Ce paramètre doit être défini sur managedidentity si votre fonction Azure déployée utilise l’authentification de l’identité managée. Cette valeur n’est valide que lorsqu’une identité managée est disponible dans l’environnement d’hébergement.
WebPubSubForSocketIOConnectionString__clientId Lorsque credential a pour valeur managedidentity, cette propriété permet de spécifier l’identité attribuée par l’utilisateur qui doit être utilisée pour obtenir un jeton. La propriété accepte un ID client correspondant à une identité attribuée par l’utilisateur affectée à l’application. Par défaut, l’identité affectée par le système est utilisée.

La liaison de fonction suit les propriétés courantes de la configuration basée sur l’identité. Consultez les propriétés courantes pour les connexions basées sur des identités pour obtenir plus de propriétés non mentionées.

Pour le développement local, utilisez le fichier local.settings.json pour stocker la chaîne de connexion. Définissez WebPubSubForSocketIOConnectionString à la chaîne de connexion copiée à l’étape précédente :

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

Si vous souhaitez utiliser la configuration basée sur l’identité et s’exécuter en ligne, AzureWebJobsStorage devrait se référer à la connexion au stockage hôte avec une identité.

Liaison d’entrée

Socket.IO liaison d’entrée génère une requête SocketIONegotiationResult de négociation du client. Lorsqu’un client Socket.IO tente de se connecter au service, il doit connaître le endpoint, path et access token pour l’authentification. Il est courant de disposer d’un serveur pour générer ces données, appelées négociation.

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

Attribut

L’attribut de la liaison d’entrée est [SocketIONegotiation].

Propriété d’attribut Description
Hub Nom du hub auquel un client doit se connecter.
Connexion Nom du paramètre d’application qui contient la chaîne de connexion Socket.IO (valeur par défaut WebPubSubForSocketIOConnectionString).
UserId userId de la connexion. Elle s’applique à tous les sockets de la connexion. Il devient la revendication sub dans le jeton généré.

Liaison de déclencheur

Azure Function utilise la liaison de déclencheur pour déclencher une fonction pour traiter les événements à partir de Web PubSub pour Socket.IO.

La liaison de déclencheur expose un chemin spécifique suivi du point de terminaison de fonction Azure. L’URL doit être définie comme modèle d’URL du service (Portail : paramètres -> gestionnaire d’événements -> Modèle d’URL). Dans le modèle de point de terminaison, la partie requête code=<API_KEY> est OBLIGATOIRE lorsque vous utilisez Azure Function App pour des raisons de sécurité. La clé est accessible dans le portail Azure. Localisez votre ressource d’application de fonction et accédez à Functions ->App keys ->System keys ->socketio_extension après avoir déployé l’application de fonction sur Azure. Toutefois, cette clé n’est pas nécessaire lorsque vous utilisez des fonctions locales.

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

Déclencheurs de fonction pour l’événement socket connect.

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

Déclencheurs de fonction pour l’événement connecté au socket.

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

Déclencheurs de fonction pour l’événement de déconnexion de socket.

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

Déclencheurs de fonction pour les messages normaux des clients.

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

Attributs

L’attribut de la liaison de déclencheur est [SocketIOTrigger].

Propriété d’attribut Description
Hub Nom du hub auquel un client doit se connecter.
Espace de noms L’espace de noms du socket. Par défaut: « / »
EventName Nom de l’événement pour lequel la fonction se déclenche. Certains noms d’événements sont prédéfinis : connect pour l’événement socket connect. connected pour l’événement connecté au socket. disconnected pour l’événement déconnecté de socket. D’autres événements sont définis par l’utilisateur et doivent correspondre au nom de l’événement envoyé par le côté client.
ParameterNames Liste des noms de paramètre de l’événement. La longueur de la liste doit être cohérente avec l’événement envoyé par le client. Et le nom utilise les expressions de liaison et l’accès par le paramètre de fonction de même nom.

Lier des données

[SocketIOTrigger] lie certaines variables à des données de liaison. Vous pouvez en savoir plus sur celui-ci à partir de modèles d’expression de liaison Azure Functions

SocketIOAttribute

SocketIOAttribute est une alternative de ParameterNames, qui simplifie la définition de la fonction. Par exemple, les deux définitions suivantes ont le même effet :

[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)
{
}

Notez que ParameterNames et [SocketIOParameter] ne peuvent pas être utilisés ensemble.

Requête de liaison d’entrée

La structure des données des arguments de liaison d’entrée varie en fonction du type de message.

Connexion

{
    "namespace": "",
    "socketId": "",
    "claims": {
        "<claim-type>": [ "<claim-value>" ]
    },
    "query": {
        "<query-key>": [ "<query-value>" ]
    },
    "headers":{
        "<header-name>": [ "<header-value>" ]
    },
    "clientCertificates":{
        {
            "thumbprint": "",
            "content": ""
        }
    }
}
Propriété Description
espace de noms L’espace de noms du socket.
socketId Identité unique du socket.
réclamations Revendication de JWT de la connexion cliente. Notez que ce n’est pas le JWT lorsque le service demande la fonction, mais le JWT lorsque le client Engine.IO se connecte au service.
query Requête de la connexion cliente. Notez que ce n’est pas la requête lorsque le service demande la fonction, mais la requête lorsque le client Engine.IO se connecte au service.
headers Les en-têtes de la connexion cliente. Notez que ce ne sont pas les en-têtes lorsque le service demande la fonction, mais les en-têtes lorsque le client Engine.IO se connecte au service.
clientCertificates Certificat client, s’il est activé

Connecté

{
    "namespace": "",
    "socketId": "",
}
Propriété Description
espace de noms L’espace de noms du socket.
socketId Identité unique du socket.

Déconnecté

{
    "namespace": "",
    "socketId": "",
    "reason": ""
}
Propriété Description
espace de noms L’espace de noms du socket.
socketId Identité unique du socket.
reason Description de la raison de fermeture de la connexion.

Événements normaux

{
    "namespace": "",
    "socketId": "",
    "payload": "",
    "eventName": "",
    "parameters": []
}
Propriété Description
espace de noms L’espace de noms du socket.
socketId Identité unique du socket.
payload Charge utile du message dans le protocole Engine.IO
eventName Nom de l’événement de la requête.
parameters Liste des paramètres du message.

Liaison de sortie

La liaison de sortie prend actuellement en charge les fonctionnalités suivantes :

  • Ajouter un socket à la salle
  • Supprimer un socket de la salle
  • Envoyer des messages à une session
  • Envoyer des messages à un groupe
  • Envoyer des messages à un espace de noms
  • Déconnecter les 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" }));
}

Attribut

L’attribut de la liaison d’entrée est [SocketIO].

Propriété d’attribut Description
Hub Nom du hub auquel un client doit se connecter.
Connexion Nom du paramètre d’application qui contient la chaîne de connexion Socket.IO (valeur par défaut WebPubSubForSocketIOConnectionString).

Actions

La liaison de sortie utilise des actions pour effectuer des opérations. Actuellement, nous prenons en charge les actions suivantes :

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
}