Enlace del desencadenador de SignalR Service para Azure Functions

Use el enlace del desencadenador de SignalR para responder a mensajes enviados desde Azure SignalR Service. Cuando se desencadena la función, los mensajes pasados a la función se analizan como un objeto JSON.

En el modo sin servidor de SignalR Service, SignalR Service usa la característica Upstream para enviar mensajes del cliente a la aplicación de funciones. Y la aplicación de funciones usa el enlace de desencadenador de SignalR Service para controlar estos mensajes. A continuación se muestra la arquitectura general:

Arquitectura de desencadenadores de SignalR

Para obtener información sobre los detalles de instalación y configuración, vea la información general.

Ejemplo

Se puede crear una función C# mediante uno de los siguientes modos de C#:

  • Modelo de trabajo aislado: función compilada en C# que se ejecuta en un proceso trabajador aislado del tiempo de ejecución. Se requiere un proceso de trabajo aislado para admitir funciones de C# ejecutándose en versiones de .NET que son y no son LTS y .NET Framework.
  • Modelo en curso: función C# compilada que se ejecuta en el mismo proceso que el tiempo de ejecución de Functions.
  • Script de C#: se usa principalmente al crear funciones de C# en Azure Portal.

En el ejemplo siguiente se muestra una función de C# que recibe un evento de mensaje de los clientes y registra el contenido del mensaje.

[Function(nameof(OnClientMessage))]
public static void OnClientMessage(
    [SignalRTrigger("Hub", "messages", "sendMessage", "content", ConnectionStringSetting = "SignalRConnection")]
        SignalRInvocationContext invocationContext, string content, FunctionContext functionContext)
{
    var logger = functionContext.GetLogger(nameof(OnClientMessage));
    logger.LogInformation("Connection {connectionId} sent a message. Message content: {content}", invocationContext.ConnectionId, content);
}

Importante

El modelo basado en clases de enlaces de SignalR Service en el trabajo aislado de C# no optimiza la forma de escribir desencadenadores de SignalR debido a la limitación del modelo de trabajo de C#. Para obtener más información sobre el modelo basado en clases, vea Modelo basado en clases.

Actualmente Java no admite el desencadenador de SignalR.

Estos son los datos de enlace del archivo function.json:

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "hubName1",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}
app.generic("function1",
    {
        trigger: { "type": "signalRTrigger", "name": "invocation", "direction": "in", "hubName": "hubName1", "event": "SendMessage", "category": "messages" },
        handler: (triggerInput, context) => {
            context.log(`Receive ${context.Arguments[0]} from ${triggerInput.ConnectionId}.`)
        }
    })

Los ejemplos completos de PowerShell están pendientes.

Este es el código de Python:

import logging
import json
import azure.functions as func

def main(invocation) -> None:
    invocation_json = json.loads(invocation)
    logging.info("Receive {0} from {1}".format(invocation_json['Arguments'][0], invocation_json['ConnectionId']))

Atributos

Tanto las bibliotecas de C# en proceso como las de proceso de trabajo aislado usan el atributo SignalRTrigger para definir la función. El script de C#, en su lugar, usa un archivo de configuración function.json.

En la siguiente tabla se detallan las propiedades del atributo SignalRTrigger.

Propiedad de atributo Descripción
HubName Este valor debe establecerse en el nombre del centro de SignalR para la función que se va a desencadenar.
Categoría Este valor debe establecerse como la categoría de mensajes para la función que se va a desencadenar. La categoría puede ser uno de los siguientes valores:
  • conexiones: que incluye eventos conectados y desconectados.
  • mensajes: que incluye todos los demás eventos, excepto los de la categoría conexiones.
Evento Este valor debe establecerse como el evento de mensajes para la función que se va a desencadenar. En la categoría mensajes, el evento es el objetivo en el mensaje de invocación que envían los clientes. En la categoría conexiones, solo se usan conectados y desconectados.
parameterNames (Opcional) Lista de nombres que se enlaza a los parámetros.
ConnectionStringSetting El nombre de la configuración de la aplicación que contiene la cadena de conexión de SignalR Service, que por defecto es AzureSignalRConnectionString.

anotaciones

Actualmente no hay ninguna anotación de Java compatible con un desencadenador de SignalR.

Configuración

En la siguiente tabla se explican las propiedades de configuración de enlace que se establecen en el archivo function.json.

Propiedad de function.json Descripción
type Se debe establecer en SignalRTrigger.
direction Se debe establecer en in.
name Nombre de variable utilizado en el código de función para el objeto de contexto de invocación del desencadenador.
hubName Este valor debe establecerse en el nombre del centro de SignalR para la función que se va a desencadenar.
category Este valor debe establecerse como la categoría de mensajes para la función que se va a desencadenar. La categoría puede ser uno de los siguientes valores:
  • conexiones: que incluye eventos conectados y desconectados.
  • mensajes: que incluye todos los demás eventos, excepto los de la categoría conexiones.
event Este valor debe establecerse como el evento de mensajes para la función que se va a desencadenar. En la categoría mensajes, el evento es el objetivo en el mensaje de invocación que envían los clientes. En la categoría conexiones, solo se usan conectados y desconectados.
parameterNames (Opcional) Lista de nombres que se enlaza a los parámetros.
connectionStringSetting El nombre de la configuración de la aplicación que contiene la cadena de conexión de SignalR Service, que por defecto es AzureSignalRConnectionString.

Consulte la sección de ejemplos para ver ejemplos completos.

Uso

Payloads

El tipo de entrada del desencadenador se declara como InvocationContext o como un tipo personalizado. Si elige InvocationContext, obtendrá acceso completo al contenido de la solicitud. En un tipo personalizado, el runtime intenta analizar el cuerpo de la solicitud JSON para establecer las propiedades del objeto.

InvocationContext

InvocationContext incluye todo el contenido del mensaje enviado desde un servicio SignalR, que incluye las siguientes propiedades:

Propiedad Descripción
Argumentos Disponible para la categoría mensajes. Contiene argumentos en el mensaje de invocación.
Error Disponible para evento desconectado. Puede estar vacío si la conexión se cerró sin errores o puede contener los mensajes de error.
Hub Nombre del centro al que pertenece el mensaje.
Category Categoría del mensaje.
Evento Evento del mensaje.
ConnectionId Identificador de conexión del cliente que envía el mensaje.
UserId Identidad de usuario del cliente que envía el mensaje.
Encabezados los encabezados de la solicitud.
Consultar La consulta de la solicitud cuando los clientes se conectan al servicio.
Notificaciones Las notificaciones del cliente.

Usar ParameterNames

La propiedad ParameterNames de SignalRTrigger permite enlazar argumentos de mensajes de invocación con los parámetros de funciones. Puede utilizar el nombre que ha definido como parte de expresiones de enlace en otro enlace o como parámetros en el código. Esto proporciona una manera más práctica de acceder a los argumentos de InvocationContext.

Imagine que tiene un cliente de SignalR de JavaScript que intenta invocar el método broadcast en Azure Functions con dos argumentos: message1, message2.

await connection.invoke("broadcast", message1, message2);

Después de establecer parameterNames, los nombres definidos se corresponderán con los argumentos enviados en el lado cliente.

[SignalRTrigger(parameterNames: new string[] {"arg1, arg2"})]

A continuación, arg1 contiene el contenido de message1y arg2 contiene el contenido de message2.

Consideraciones de ParameterNames

Al enlazar parámetros, el orden es importante. Si está utilizando ParameterNames, el orden de ParameterNames coincide con el orden de los argumentos que se invocan en el cliente. Si está utilizando el atributo [SignalRParameter] en C#, el orden de los argumentos en los métodos de Azure Functions coincide con el orden de los argumentos en los clientes.

ParameterNames y el atributo [SignalRParameter]no se pueden usar al mismo tiempo o obtendrá una excepción.

Integración de SignalR Service

SignalR Service necesita una dirección URL para acceder a la aplicación de funciones cuando se usa el enlace de desencadenador de SignalR Service. La dirección URL se debe configurar en Configuración ascendente en el lado de SignalR Service.

Portal de Upstream

Al usar el desencadenador signalR Service, la dirección URL puede ser sencilla y formateada de la siguiente manera:

<Function_App_URL>/runtime/webhooks/signalr?code=<API_KEY>

Function_App_URL Se puede encontrar en la página Información general de Function App y azure Function genera el API_KEY . Puede obtener API_KEY de signalr_extension en la hoja Claves de la aplicación de la aplicación de funciones. Clave de API

Si quiere usar más de una aplicación de funciones junto con una instancia de SignalR Service, Upstream también puede admitir reglas de enrutamiento complejas. Encuentre más información en Configuración ascendente.

Ejemplo paso a paso

Puede seguir el ejemplo de GitHub para implementar un salón de chat en una aplicación de funciones con la característica de enlace de desencadenador y Upstream de SignalR Service: Ejemplo de salón de chat bidireccional

Pasos siguientes