SignalR Service-Auslöserbindung für Azure Functions

Verwenden Sie die SignalR-Auslöserbindung, um auf Nachrichten zu antworten, die von Azure SignalR Service gesendet werden. Beim Auslösen der Funktion werden die an die Funktion übergebenen Nachrichten als JSON-Objekt analysiert.

Im serverlosen Modus des SignalR Service verwendet SignalR Service das Feature Upstream, um Nachrichten vom Client an die Funktions-App zu senden. Und die Funktions-App verwendet die SignalR Service-Triggerbindung, um diese Nachrichten zu verarbeiten. Die allgemeine Architektur wird unten dargestellt:

SignalR-Triggerarchitektur

Informationen zu Setup- und Konfigurationsdetails finden Sie in der Übersicht.

Beispiel

Eine C#-Funktion kann mit einem der folgenden C#-Modi erstellt werden:

  • Isoliertes Workermodell: Kompilierte C#-Funktion, die in einem Workerprozess ausgeführt wird, der von der Runtime isoliert ist. Ein isolierter Workerprozess ist erforderlich, um C#-Funktionen zu unterstützen, die in LTS- und Nicht-LTS-Versionen von .NET und .NET Framework ausgeführt werden.
  • In-Process-Modell: Kompilierte C#-Funktion, die im gleichen Prozess wie die Functions-Runtime ausgeführt wird.
  • C#-Skript: Wird hauptsächlich beim Erstellen von C#-Funktionen im Azure-Portal verwendet.

Wichtig

Die Unterstützung für das In-Process-Modell endet am 10. November 2026. Es wird dringend empfohlen, Ihre Apps zum isolierten Workermodell zu migrieren, um den vollständigen Support zu ermöglichen.

Das folgende Beispiel zeigt eine C#-Funktion, die ein Nachrichtenereignis von Clients empfängt und den Nachrichteninhalt protokolliert.

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

Wichtig

Das klassenbasierte Modell von SignalR-Dienstbindungen in isolierten C#-Workern optimiert nicht, wie SignalR-Trigger aufgrund der Einschränkung des C#-Arbeitsmodells geschrieben werden. Weitere Informationen zum klassenbasierten Modell finden Sie unter Klassenbasiertes Modell.

SignalR-Trigger werden für Java derzeit nicht unterstützt.

Die Bindungsdaten in der Datei 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}.`)
        }
    })

Vollständige PowerShell-Beispiele stehen aus.

Dies ist der Python-Code:

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']))

Attributes

Von C#-Bibliotheken des Typs prozessintern und isolierter Workerprozess wird das Attribut SignalRTrigger verwendet, um die Funktion zu definieren. Vom C#-Skript wird stattdessen die Konfigurationsdatei function.json verwendet.

In der folgenden Tabelle werden die Eigenschaften des SignalRTrigger-Attributs erläutert.

Attributeigenschaft BESCHREIBUNG
HubName Dieser Wert muss auf den Namen des SignalR-Hubs festgelegt werden, damit die Funktion ausgelöst werden kann.
Kategorie Dieser Wert muss als die Kategorie von Nachrichten festgelegt werden, damit die Funktion ausgelöst wird. Bei der Kategorie kann es sich um einen der folgenden Werte handeln:
  • connections: Einschließlich der Ereignisse connected und disconnected
  • messages: Einschließlich aller anderen Ereignisse außer denen in der Kategorie connections
Event Dieser Wert muss als das Ereignis von Nachrichten festgelegt werden, damit die Funktion ausgelöst wird. Bei der Kategorie messages ist das Ereignis das Ziel in der Aufrufnachricht, die Clients senden. Für die Kategorie connections wird nur connected und disconnected verwendet.
ParameterNames (Optional) Eine Liste von Namen, die an die Parameter gebunden werden.
ConnectionStringSetting Der Name der Anwendungseinstellung, die die Verbindungszeichenfolge des SignalR-Diensts enthält (standardmäßig AzureSignalRConnectionString).

Anmerkungen

Für SignalR-Trigger steht derzeit keine unterstützte Java-Anmerkung zur Verfügung.

Konfiguration

Die folgende Tabelle gibt Aufschluss über die Bindungskonfigurationseigenschaften, die Sie in der Datei function.json festlegen.

function.json-Eigenschaft BESCHREIBUNG
type Muss auf SignalRTrigger festgelegt sein.
direction Muss auf in festgelegt sein.
name Im Funktionscode für das Kontextobjekt des Auslöseraufrufs verwendeter Variablenname.
hubName Dieser Wert muss auf den Namen des SignalR-Hubs festgelegt werden, damit die Funktion ausgelöst werden kann.
category Dieser Wert muss als die Kategorie von Nachrichten festgelegt werden, damit die Funktion ausgelöst wird. Bei der Kategorie kann es sich um einen der folgenden Werte handeln:
  • connections: Einschließlich der Ereignisse connected und disconnected
  • messages: Einschließlich aller anderen Ereignisse außer denen in der Kategorie connections
event Dieser Wert muss als das Ereignis von Nachrichten festgelegt werden, damit die Funktion ausgelöst wird. Bei der Kategorie messages ist das Ereignis das Ziel in der Aufrufnachricht, die Clients senden. Für die Kategorie connections wird nur connected und disconnected verwendet.
parameterNames (Optional) Eine Liste von Namen, die an die Parameter gebunden werden.
connectionStringSetting Der Name der Anwendungseinstellung, die die Verbindungszeichenfolge des SignalR-Diensts enthält (standardmäßig AzureSignalRConnectionString).

Vollständige Beispiele finden Sie im Abschnitt „Beispiele“.

Verwendung

Payloads

Der Triggereingabetyp wird entweder als InvocationContext oder als benutzerdefinierter Typ deklariert. Wenn Sie dies auswählen InvocationContext, erhalten Sie vollzugriff auf den Anforderungsinhalt. Bei einem benutzerdefinierten Typ versucht die Laufzeit, den JSON-Anforderungstext zu analysieren, um die Objekteigenschaften festzulegen.

InvocationContext

InvocationContext enthält den gesamten Inhalt der Nachricht, die von einem SignalR-Dienst gesendet wird – einschließlich folgender Eigenschaften:

Eigenschaft BESCHREIBUNG
Argumente Verfügbar für die Kategorie messages. Enthält Argumente in der Aufrufnachricht.
Fehler Verfügbar für das Ereignis disconnected. Kann leer sein, wenn die Verbindung ohne Fehler geschlossen wurde, oder enthält die Fehlermeldungen.
Hub Der Hubname, zu dem die Nachricht gehört.
Kategorie Die Kategorie der Nachricht.
Ereignis Das Ereignis der Nachricht.
ConnectionId Die Verbindungs-ID des Clients, der die Nachricht sendet.
UserId Die Benutzeridentität des Clients, der die Nachricht sendet.
Headers Die Header der Anforderung.
Abfrage Die Abfrage der Anforderung, wenn sich Clients mit dem Dienst verbinden.
Ansprüche Die Ansprüche des Clients.

Verwenden von ParameterNames

Mit der Eigenschaft ParameterNames in SignalRTrigger können Argumente von Aufrufnachrichten an die Parameter von Funktionen gebunden werden. Der von Ihnen definierte Name kann als Teil der Bindungsausdrücke in anderen Bindungen oder als Parameter im Code verwendet werden. Dadurch erhalten Sie einen bequemeren Zugriff auf die Argumente von InvocationContext.

Angenommen, Sie haben einen JavaScript-SignalR-Client, der versucht, die Methode broadcast in Azure Functions mit zwei Argumenten (message1, message2) aufzurufen.

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

Nachdem Sie parameterNames festgelegt haben, entsprechen die von Ihnen definierte Name den Argumenten, die auf der Clientseite gesendet werden.

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

Enthält dann arg1 den Inhalt von message1, und arg2 enthält den Inhalt von message2.

Überlegungen im Zusammenhang mit ParameterNames

Für die Parameterbindung ist die Reihenfolge wichtig. Wenn Sie ParameterNames verwenden, entspricht die Reihenfolge in ParameterNames der Reihenfolge der Argumente, die Sie im Client aufrufen. Wenn Sie das Attribut [SignalRParameter] in C# verwenden, entspricht die Reihenfolge der Argumente in Azure Functions-Methoden der Reihenfolge der Argumente in Clients.

ParameterNames und das Attribut [SignalRParameter]kann nicht gleichzeitig verwendet werden, oder Sie erhalten eine Ausnahme.

SignalR Service-Integration

Der signalr-Dienst benötigt eine URL für den Zugriff auf die Funktions-App, wenn Sie die SignalR Service-Triggerbindung verwenden. Die URL sollte in Upstreameinstellungen auf der SignalR Service-Seite konfiguriert werden.

Upstreamportal

Bei Verwendung des SignalR-Diensttriggers kann die URL wie folgt einfach und formatiert werden:

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

Die Function_App_URL Finden Sie auf der Seite "Übersicht" der Funktions-App, und die API_KEY wird von Azure Function generiert. Sie können den API_KEY von signalr_extension auf dem Blatt API_KEY der Funktions-App abrufen. API-Schlüssel

Wenn Sie mehrere Funktions-Apps in Verbindung mit einem SignalR Service verwenden möchten, kann der Upstream auch komplexe Routingregeln unterstützen. Weitere Informationen finden Sie unter Upstreameinstellungen.

Beispiel mit allen Einzelschritten

Sie können das Beispiel in GitHub befolgen, um einen Chatraum für die Funktions-App mit der SignalR Service-Triggerbindung und der Upstreamfunktion bereitzustellen: Beispiel für bidirektionalen Chatraum

Nächste Schritte