associazione di trigger Servizio SignalR per Funzioni di Azure

Usare l'associazione di trigger SignalR per rispondere ai messaggi inviati da Servizio Azure SignalR. Quando viene attivata la funzione, i messaggi passati alla funzione vengono analizzati come oggetto json.

In Servizio SignalR modalità serverless, Servizio SignalR usa la funzionalità Upstream per inviare messaggi dal client all'app per le funzioni. E l'app per le funzioni usa Servizio SignalR'associazione di trigger per gestire questi messaggi. L'architettura generale è illustrata di seguito:

Architettura del trigger SignalR

Per informazioni sui dettagli di impostazione e configurazione, vedere la panoramica.

Esempio

È possibile creare una funzione C# usando una delle modalità C# seguenti:

  • Modello di lavoro isolato: funzione C# compilata eseguita in un processo di lavoro isolato dal runtime. Il processo di lavoro isolato è necessario per supportare le funzioni C# in esecuzione in LTS e versioni non LTS .NET e .NET Framework.
  • Modello in-process: funzione C# compilata eseguita nello stesso processo del runtime di Funzioni.
  • Script C#: usato principalmente quando si creano funzioni C# nel portale di Azure.

L'esempio seguente mostra una funzione C# che riceve un evento di messaggio dai client e registra il contenuto del messaggio.

[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

Il modello basato su classi delle associazioni Servizio SignalR in un ruolo di lavoro isolato C# non ottimizza il modo in cui si scrivono trigger SignalR a causa della limitazione del modello di lavoro C#. Per altre informazioni sul modello basato su classi, vedere Modello basato su classi.

Il trigger SignalR non è attualmente supportato per Java.

Ecco i dati di associazione nel file 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}.`)
        }
    })

Gli esempi completi di PowerShell sono in sospeso.

Ecco il codice 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']))

Attributi

Sia le librerie C# in-process che il processo di lavoro isolato usano l'attributo SignalRTrigger per definire la funzione. Lo script C# usa invece un file di configurazione function.json.

Nella tabella seguente vengono illustrate le proprietà dell'attributo SignalRTrigger .

Proprietà dell'attributo Descrizione
HubName Questo valore deve essere impostato sul nome dell'hub SignalR per attivare la funzione.
Categoria Questo valore deve essere impostato come categoria di messaggi per l'attivazione della funzione. La categoria può essere uno dei valori seguenti:
  • connessioni: inclusi gli eventi connessi e disconnessi
  • messages: inclusi tutti gli altri eventi ad eccezione di quelli nella categoria connessioni
Evento Questo valore deve essere impostato come evento dei messaggi per l'attivazione della funzione. Per la categoria di messaggi , l'evento è la destinazione nel messaggio di chiamata inviato dai client. Per la categoria di connessioni viene usata solo la connessione e la disconnessione .
ParameterNames (Facoltativo) Elenco di nomi associati ai parametri.
ConnectionStringSetting Nome dell'impostazione dell'app che contiene il Servizio SignalR stringa di connessione, che per impostazione predefinita è AzureSignalRConnectionString.

Annotazioni

Attualmente non esiste un'annotazione Java supportata per un trigger SignalR.

Impostazione

Nella tabella seguente sono illustrate le proprietà di configurazione dell'associazione impostate nel file function.json.

Proprietà di function.json Descrizione
type Deve essere impostato su SignalRTrigger.
direction Deve essere impostato su in.
name Nome della variabile usato nel codice della funzione per l'oggetto contesto di chiamata del trigger.
hubName Questo valore deve essere impostato sul nome dell'hub SignalR per attivare la funzione.
category Questo valore deve essere impostato come categoria di messaggi per l'attivazione della funzione. La categoria può essere uno dei valori seguenti:
  • connessioni: inclusi gli eventi connessi e disconnessi
  • messages: inclusi tutti gli altri eventi ad eccezione di quelli nella categoria connessioni
event Questo valore deve essere impostato come evento dei messaggi per l'attivazione della funzione. Per la categoria di messaggi , l'evento è la destinazione nel messaggio di chiamata inviato dai client. Per la categoria di connessioni viene usata solo la connessione e la disconnessione .
parameterNames (Facoltativo) Elenco di nomi associati ai parametri.
connectionStringSetting Nome dell'impostazione dell'app che contiene il Servizio SignalR stringa di connessione, che per impostazione predefinita è AzureSignalRConnectionString.

Per esempi completi, vedere la sezione di esempio.

Utilizzo

Payload

Il tipo di input del trigger viene dichiarato come InvocationContext o come tipo personalizzato. Se si sceglie InvocationContext, si ottiene l'accesso completo al contenuto della richiesta. Per un tipo personalizzato, il runtime cerca di analizzare il corpo della richiesta JSON per impostare le proprietà dell'oggetto.

InvocationContext

InvocationContext contiene tutto il contenuto del messaggio inviato da un servizio SignalR, che include le proprietà seguenti:

Proprietà Descrizione
Argomenti Disponibile per la categoria di messaggi . Contiene argomenti nel messaggio di chiamata
Error Disponibile per l'evento disconnesso . Può essere Vuoto se la connessione è chiusa senza errori o contiene i messaggi di errore.
Hub Nome dell'hub a cui appartiene il messaggio.
Categoria Categoria del messaggio.
Event Evento del messaggio.
ID connessione ID connessione del client che invia il messaggio.
ID utente Identità utente del client che invia il messaggio.
Intestazioni Intestazioni della richiesta.
Query Query della richiesta quando i client si connettono al servizio.
Richieste Attestazioni del client.

uso di ParameterNames

La proprietà ParameterNames in SignalRTrigger consente di associare argomenti di messaggi di chiamata ai parametri delle funzioni. È possibile usare il nome definito come parte delle espressioni di associazione in altre associazioni o come parametri nel codice. In questo modo è possibile accedere agli argomenti di InvocationContext.

Si supponga di avere un client JavaScript SignalR che tenta di richiamare il metodo broadcast nella funzione di Azure con due argomenti message1, message2.

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

Dopo aver impostato parameterNames, i nomi definiti corrispondono agli argomenti inviati sul lato client.

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

Contiene quindi arg1 il contenuto di message1e arg2 contiene il contenuto di message2.

ParameterNames Considerazioni

Per l'associazione di parametri, l'ordine è importante. Se si usa ParameterNames, l'ordine in ParameterNames corrisponde all'ordine degli argomenti richiamati nel client. Se si usa l'attributo [SignalRParameter] in C#, l'ordine degli argomenti nei metodi di Funzione di Azure corrisponde all'ordine degli argomenti nei client.

ParameterNamesNon è possibile usare l'attributo [SignalRParameter] e contemporaneamente oppure si otterrà un'eccezione.

integrazione di Servizio SignalR

Servizio SignalR richiede un URL per accedere all'app per le funzioni quando si usa Servizio SignalR'associazione di trigger. L'URL deve essere configurato in Impostazioni upstream sul lato Servizio SignalR.

Portale upstream

Quando si usa Servizio SignalR trigger, l'URL può essere semplice e formattato come segue:

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

L'elemento Function_App_URL è disponibile nella pagina Panoramica dell'app per le funzioni e viene API_KEY generato dalla funzione di Azure. È possibile ottenere da API_KEY signalr_extension nel pannello Chiavi app dell'app per le funzioni. Chiave API

Se si vuole usare più app per le funzioni insieme a una Servizio SignalR, upstream può supportare anche regole di routing complesse. Per altre informazioni, vedere Impostazioni Upstream.

Esempio dettagliato

È possibile seguire l'esempio in GitHub per distribuire una chat room nell'app per le funzioni con Servizio SignalR l'associazione di trigger e la funzionalità upstream: Esempio di chat room bidirezionale

Passaggi successivi