Compartilhar via


Gatilhos e vinculações do Azure Functions do Socket.IO (versão prévia)

Este artigo explica como usar a integração sem servidor do Socket.IO com o Azure Functions.

Ação Tipo de associação
Obter o resultado da negociação do cliente, incluindo url e token de acesso Associação de entrada
Disparado por mensagens do serviço Associação de gatilho
Invocar o serviço para enviar mensagens ou gerenciar clientes Associação de saída

Código-fonte | Pacote | Documentação de referência da API | Documentação do produto | Exemplos

Importante

As vinculações do Azure Functions só podem se integrar ao Web PubSub para Socket.IO no Modo Sem Servidor.

Autenticar e Cadeia de Conexão

Para permitir que a extensão funcione com o Web PubSub para Socket.IO, você precisa fornecer chaves de acesso ou uma configuração baseada em identidade para autenticação no serviço.

Acessar configuração baseada em chave

Nome da Configuração Descrição
WebPubSubForSocketIOConnectionString Obrigatória. Cadeia de conexão baseada em chave para o serviço

Você pode encontrar a cadeia de conexão na folha Chaves no Web PubSub para Socket.IO no portal do Azure.

Para o desenvolvimento local, use o arquivo local.settings.json para armazenar a cadeia de conexão. Configure WebPubSubForSocketIOConnectionString para a cadeia de conexão copiada da etapa anterior:

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

Após a implantação, use as configurações do aplicativo para configurar a cadeia de conexão.

Configuração baseada em identidade

Nome da Configuração Descrição
WebPubSubForSocketIOConnectionString__endpoint Obrigatória. O Ponto de Extremidade do serviço. Por exemplo, https://mysocketio.webpubsub.azure.com
WebPubSubForSocketIOConnectionString__credential Define como um token deve ser obtido para a conexão. Essa configuração deve ser definida como managedidentity se o Azure Function implantado pretender usar a autenticação de identidade gerenciada. Esse valor só é válido quando uma identidade gerenciada está disponível no ambiente de hospedagem.
WebPubSubForSocketIOConnectionString__clientId Quando credential estiver definido como managedidentity, essa propriedade poderá ser definida para especificar a identidade atribuída pelo usuário a ser usada ao obter um token. A propriedade aceita uma ID de cliente correspondente a uma identidade atribuída pelo usuário atribuída ao aplicativo. Se não for especificada, a identidade atribuída pelo sistema será usada.

A vinculação de função segue as propriedades comuns para a configuração baseada em identidade. Confira Propriedades comuns para conexões baseadas em identidade para obter mais propriedades não mencionadas.

Para o desenvolvimento local, use o arquivo local.settings.json para armazenar a cadeia de conexão. Configure WebPubSubForSocketIOConnectionString para a cadeia de conexão copiada da etapa anterior:

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

Se quiser usar a configuração baseada em identidade e executar online, o AzureWebJobsStorage deve se referir à Conexão ao armazenamento de host com uma identidade.

Associação de entrada

A vinculação de entrada do Socket.IO gera um SocketIONegotiationResult para a solicitação de negociação do cliente. Quando tenta se conectar ao serviço, um cliente do Socket.IO precisa saber o endpoint, path e access token para a autenticação. É uma prática comum ter um servidor para gerar esses dados, o que é chamado de negociação.

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

Atributo

O atributo para a vinculação de entrada é [SocketIONegotiation].

Propriedade de atributo Descrição
Hub O nome do hub ao qual um cliente precisa se conectar.
Conexão O nome da configuração do aplicativo que contém a cadeia de conexão do Socket.IO (o padrão é WebPubSubForSocketIOConnectionString).
UserId A userId da conexão. Aplica-se a todos os soquetes na conexão. E se torna a declaração sub no token gerado.

Vinculação de gatilho

O Azure Functions usa a vinculação de gatilho para disparar uma função para processar os eventos do Web PubSub para Socket.IO.

A vinculação de gatilho expõe um caminho específico seguido do ponto de extremidade do Azure Functions. A url deve ser configurada como o Modelo de URL do serviço (Portal: configurações -> manipulador de eventos -> Modelo de URL). No padrão do ponto de extremidade, a parte de consulta code=<API_KEY> é NECESSÁRIA quando você está usando o Aplicativo de Funções do Azure por motivos desegurança. A chave pode ser encontrada no portal do Azure. Encontre o recurso do aplicativo de funções e navegue até Funções ->Chaves do aplicativo ->Chaves do sistema ->socketio_extension após você implantar o aplicativo de funções no Azure. No entanto, essa chave não é necessária quando se está trabalhando com funções locais.

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

Gatilhos de função para o evento de conexão de soquete.

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

Gatilhos de função para o evento conectado de soquete.

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

Gatilhos de função para o evento de desconexão de soquete.

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

Gatilhos de função para mensagens normais de clientes.

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

Atributos

O atributo para a vinculação de gatilho é [SocketIOTrigger].

Propriedade de atributo Descrição
Hub O nome do hub ao qual um cliente precisa se conectar.
Namespace O namespace do soquete. Padrão: "/"
EventName O nome do evento para o qual a função dispara. Alguns nomes de evento são predefinidos: connect para o evento de conexão de soquete. connected para o evento conectado de soquete. disconnected para o evento desconectado de soquete. E os outros eventos são definidos pelo usuário e precisam corresponder ao nome do evento enviado pelo lado do cliente.
ParameterNames A lista de nomes de parâmetros do evento. O comprimento da lista deve ser consistente com o evento enviado do cliente. E o nome usa as Expressões de vinculação e o acesso pelo parâmetro de função de mesmo nome.

Dados de vinculação

[SocketIOTrigger] vincula algumas variáveis aos dados de vinculação. Saiba mais sobre isso nos Padrões de expressão de vinculação do Azure Functions

SocketIOAttribute

SocketIOAttribute é uma alternativa de ParameterNames, o que simplifica a definição da função. Por exemplo, as duas definições a seguir têm o mesmo efeito:

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

Observe que ParameterNames e [SocketIOParameter] não podem ser usados juntos.

Solicitação de Vinculação de Entrada

A estrutura de dados dos argumentos de vinculação de entrada varia dependendo do tipo de mensagem.

Conectar

{
    "namespace": "",
    "socketId": "",
    "claims": {
        "<claim-type>": [ "<claim-value>" ]
    },
    "query": {
        "<query-key>": [ "<query-value>" ]
    },
    "headers":{
        "<header-name>": [ "<header-value>" ]
    },
    "clientCertificates":{
        {
            "thumbprint": "",
            "content": ""
        }
    }
}
Propriedade Descrição
namespace O namespace do soquete.
socketId A identidade exclusiva do soquete.
declarações A declaração do JWT da conexão do cliente. Observe que não é o JWT de quando o serviço solicita a função, mas o JWT de quando o cliente Engine.IO se conecta ao serviço.
consulta A consulta da conexão do cliente. Observe que não é a consulta de quando o serviço solicita a função, mas a consulta de quando o cliente Engine.IO se conecta ao serviço.
headers Os cabeçalhos da conexão do cliente. Observe que não são os cabeçalhos de quando o serviço solicita a função, mas os cabeçalhos de quando o cliente Engine.IO se conecta ao serviço.
clientCertificates O certificado do cliente, se estiver habilitado

Conectado

{
    "namespace": "",
    "socketId": "",
}
Propriedade Descrição
namespace O namespace do soquete.
socketId A identidade exclusiva do soquete.

Desconectado

{
    "namespace": "",
    "socketId": "",
    "reason": ""
}
Propriedade Descrição
namespace O namespace do soquete.
socketId A identidade exclusiva do soquete.
reason A descrição do motivo do encerramento da conexão.

Eventos normais

{
    "namespace": "",
    "socketId": "",
    "payload": "",
    "eventName": "",
    "parameters": []
}
Propriedade Descrição
namespace O namespace do soquete.
socketId A identidade exclusiva do soquete.
payload O conteúdo da mensagem no protocolo Engine.IO
eventName O nome do evento da solicitação.
parâmetros Lista de parâmetros da mensagem.

Associação de saída

Atualmente, a vinculação de saída dá suporte à seguinte funcionalidade:

  • Adicionar um soquete à sala
  • Remover um soquete da sala
  • Enviar mensagens para um soquete
  • Enviar mensagens para uma sala
  • Enviar mensagens para um namespace
  • Desconectar soquetes
[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" }));
}

Atributo

O atributo para a vinculação de entrada é [SocketIO].

Propriedade de atributo Descrição
Hub O nome do hub ao qual um cliente precisa se conectar.
Conexão O nome da configuração do aplicativo que contém a cadeia de conexão do Socket.IO (o padrão é WebPubSubForSocketIOConnectionString).

Ações

A vinculação de saída usa ações para executar operações. Atualmente, damos suporte às seguintes ações:

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
}