Auf Englisch lesen

Teilen über


SignalR Service-Ausgabebindung für Azure Functions

Auswählen einer Programmiersprache

Verwenden Sie die SignalR-Ausgabebindung, um eine oder mehrere Nachrichten mithilfe des Azure SignalR-Diensts zu senden. Sie können eine Nachricht senden an:

  • Alle verbundenen Clients
  • Verbundene Clients in einer angegebenen Gruppe
  • Verbundene Clients, die für einen bestimmten Benutzer authentifiziert sind

Die Ausgabebindung ermöglicht ihnen auch das Verwalten von Gruppen, z. B. das Hinzufügen eines Clients oder Benutzers zu einer Gruppe, das Entfernen eines Clients oder Benutzers aus einer Gruppe.

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

Beispiel

Broadcast an alle Clients

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 Funktion, die eine Nachricht mithilfe der Ausgabebindung an alle verbundenen Clients sendet. Die target-Eigenschaft entspricht dem Namen der Methode, die auf allen Clients aufgerufen wird. Die Arguments-Eigenschaft ist ein Array von 0 (null) oder mehr Objekten, das an die Clientmethode übergeben werden soll.

cs
[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
    [SignalR(HubName = "hubName1")]IAsyncCollector<SignalRMessage> signalROutput)
{
    return signalROutput.AddAsync(
        new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

Die Bindungsdaten in der Datei function.json:

Beispiel für „function.json“:

JSON
{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
JavaScript
const { app, output } = require('@azure/functions');

const signalR = output.generic({
    type: 'signalR',
    name: 'signalR',
    hubName: 'hub',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

// You can use any other trigger type instead.
app.http('broadcast', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraOutputs: [signalR],
    handler: (request, context) => {
        context.extraOutputs.set(signalR, {
            "target": "newMessage",
            "arguments": [request.body]
        });
    }
});

Vollständige PowerShell-Beispiele stehen aus.

Dies ist der Python-Code:

Python
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    signalROutput.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ message ]
    }))
Java
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}

Senden an einen Benutzer

Sie können eine Nachricht ausschließlich an Verbindungen senden, die für einen Benutzer authentifiziert wurden, indem Sie die Benutzer-ID in der SignalR-Nachricht festlegen.

cs
[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
    [SignalR(HubName = "hubName1")]IAsyncCollector<SignalRMessage> signalROutput)
{
    return signalROutput.AddAsync(
        new SignalRMessage
        {
            // the message will only be sent to this user ID
            UserId = "userId1",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

Die Bindungsdaten in der Datei function.json:

Beispiel für „function.json“:

JSON
{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

Vollständige PowerShell-Beispiele stehen aus.

Dies ist der Python-Code:

Python
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    signalROutput.set(json.dumps({
        #message will only be sent to this user ID
        'userId': 'userId1',
        'target': 'newMessage',
        'arguments': [ message ]
    }))
Java
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.userId = "userId1";
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}
JavaScript
const { app, output } = require('@azure/functions');

const signalR = output.generic({
    type: 'signalR',
    name: 'signalR',
    hubName: 'hub',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

app.http('sendToUser', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraOutputs: [signalR],
    handler: (request, context) => {
        context.extraOutputs.set(signalR, {
            "target": "newMessage",
            "arguments": [request.body],
            "userId": "userId1",
        });
    }
});

Senden an eine Gruppe

Sie können eine Nachricht ausschließlich an Verbindungen senden, die einer Gruppe hinzugefügt wurden, indem Sie den Gruppennamen in der SignalR-Nachricht festlegen.

cs
[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
    [SignalR(HubName = "hubName1")]IAsyncCollector<SignalRMessage> signalROutput)
{
    return signalROutput.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

Die Bindungsdaten in der Datei function.json:

Beispiel für „function.json“:

JSON
{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
JavaScript
const { app, output } = require('@azure/functions');

const signalR = output.generic({
    type: 'signalR',
    name: 'signalR',
    hubName: 'hub',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

app.http('sendToGroup', {
    methods: ['GET'],
    authLevel: 'anonymous',
    extraOutputs: [signalR],
    handler: (request, context) => {
        context.extraOutputs.set(signalR, {
            "target": "newMessage",
            "arguments": [request.body],
            "groupName": "myGroup",
        });
    }
});

Vollständige PowerShell-Beispiele stehen aus.

Dies ist der Python-Code:

Python
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    signalROutput.set(json.dumps({
        #message will only be sent to this group
        'groupName': 'myGroup',
        'target': 'newMessage',
        'arguments': [ message ]
    }))
Java
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.groupName = "myGroup";
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}

Gruppenverwaltung

SignalR Service ermöglicht den Benutzern das Hinzufügen zu Gruppen. Nachrichten können dann an eine Gruppe gesendet werden. Sie können dieSignalR Ausgabebindung verwenden, um die Gruppenmitgliedschaft eines Benutzers zu verwalten.

Geben Sie an: GroupActionSie ein Mitglied hinzufügen oder entfernen. Im folgenden Beispiel wird ein Benutzer einer Gruppe hinzugefügt:

C#
[FunctionName("addToGroup")]
public static Task AddToGroup(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    [SignalR(HubName = "hubName1")]
        IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

Hinweis

Um ClaimsPrincipal ordnungsgemäße zu binden, müssen Sie die Authentifizierungseinstellungen in Azure Functions konfiguriert haben.

Die Bindungsdaten in der Datei function.json:

Beispiel für „function.json“:

JSON
{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
JavaScript
const { app, output } = require('@azure/functions');

const signalR = output.generic({
    type: 'signalR',
    name: 'signalR',
    hubName: 'hub',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

// The following function adds a user to a group
app.http('addUserToGroup', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [signalR],
    handler: (request, context) => {
        context.extraOutputs.set(signalR, {
            "userId": req.query.userId,
            "groupName": "myGroup",
            "action": "add"
        });
    }
});

// The following function removes a user from a group
app.http('removeUserFromGroup', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [signalR],
    handler: (request, context) => {
        context.extraOutputs.set(signalR, {
            "userId": req.query.userId,
            "groupName": "myGroup",
            "action": "remove"
        });
    }
});

Vollständige PowerShell-Beispiele stehen aus.

Im folgenden Beispiel wird ein Benutzer einer Gruppe hinzugefügt:

Python
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    signalROutput.set(json.dumps({
        'userId': 'userId1',
        'groupName': 'myGroup',
        'action': 'add'
    }))

Im folgenden Beispiel wird ein Benutzer aus einer Gruppe entfernt:

Python
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    signalROutput.set(json.dumps({
        'userId': 'userId1',
        'groupName': 'myGroup',
        'action': 'remove'
    }))

Im folgenden Beispiel wird ein Benutzer einer Gruppe hinzugefügt:

Java
@FunctionName("addToGroup")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRGroupAction addToGroup(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
        @BindingName("userId") String userId) {

    SignalRGroupAction groupAction = new SignalRGroupAction();
    groupAction.action = "add";
    groupAction.userId = userId;
    groupAction.groupName = "myGroup";
    return action;
}

Im folgenden Beispiel wird ein Benutzer aus einer Gruppe entfernt:

Java
@FunctionName("removeFromGroup")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRGroupAction removeFromGroup(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
        @BindingName("userId") String userId) {

    SignalRGroupAction groupAction = new SignalRGroupAction();
    groupAction.action = "remove";
    groupAction.userId = userId;
    groupAction.groupName = "myGroup";
    return action;
}

Attributes

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

In der folgende Tabelle werden die Eigenschaften des SignalR-Ausgabeattributs erläutert.

Attributeigenschaft BESCHREIBUNG
HubName Dieser Wert muss auf den Namen des SignalR-Hubs festgelegt werden, für den die Verbindungsinformationen erzeugt werden.
ConnectionStringSetting Der Name der App-Einstellungs- oder Einstellungsauflistung, die den SignalR-Dienst Verbindungszeichenfolge enthält, der standardmäßig auf AzureSignalRConnectionString.

Anmerkungen

In der folgenden Tabelle werden die unterstützten Einstellungen für die SignalROutput-Anmerkung erläutert.

Einstellung BESCHREIBUNG
name Variablenname, der im Funktionscode für das Verbindungsinfoobjekt verwendet wird.
hubName Dieser Wert muss auf den Namen des SignalR-Hubs festgelegt werden, für den die Verbindungsinformationen erzeugt werden.
connectionStringSetting Der Name der App-Einstellungs- oder Einstellungsauflistung, die den SignalR-Dienst Verbindungszeichenfolge enthält, der standardmäßig auf AzureSignalRConnectionString.

Konfiguration

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

function.json-Eigenschaft BESCHREIBUNG
type Muss auf signalR festgelegt sein.
direction Muss auf out festgelegt sein.
name Variablenname, der im Funktionscode für das Verbindungsinfoobjekt verwendet wird.
hubName Dieser Wert muss auf den Namen des SignalR-Hubs festgelegt werden, für den die Verbindungsinformationen erzeugt werden.
connectionStringSetting Der Name der App-Einstellungs- oder Einstellungsauflistung, die den SignalR-Dienst Verbindungszeichenfolge enthält, der standardmäßig auf AzureSignalRConnectionString.

Wenn Sie die Entwicklung lokal ausführen, fügen Sie Ihre Anwendungseinstellungen in der Datei local.settings.json in der Values-Sammlung hinzu.

Verbrauch

Um eine optimale Sicherheit zu gewährleisten, sollte Ihre Funktions-App verwaltete IDs verwenden, wenn Sie eine Verbindung mit dem Azure SignalR-Dienst herstellen, anstatt einen Verbindungszeichenfolge zu verwenden, der einen freigegebenen geheimen Schlüssel enthält. Weitere Informationen finden Sie unter Autorisieren von Anforderungen an Azure SignalR Service-Ressourcen mit von Microsoft Entra verwalteten Identitäten.

Nächste Schritte