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:
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:
|
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:
|
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.
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.
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