SignalR Service-uitvoerbinding voor Azure Functions

Gebruik de SignalR-uitvoerbinding om een of meer berichten te verzenden met behulp van Azure SignalR Service. U kunt een bericht uitzenden naar:

  • Alle verbonden clients
  • Verbonden clients in een opgegeven groep
  • Verbonden clients geverifieerd voor een specifieke gebruiker

Met de uitvoerbinding kunt u ook groepen beheren, zoals het toevoegen van een client of gebruiker aan een groep, het verwijderen van een client of gebruiker uit een groep.

Zie het overzicht voor informatie over het instellen en configureren van details.

Opmerking

Uitzenden naar alle clients

U kunt een C#-functie maken met behulp van een van de volgende C#-modi:

  • Geïsoleerd werkrolmodel: gecompileerde C#-functie die wordt uitgevoerd in een werkproces dat is geïsoleerd van de runtime. Er is een geïsoleerd werkproces vereist om C#-functies te ondersteunen die worden uitgevoerd op langetermijnondersteuning (LTS) en niet-LTS-versies voor .NET en .NET Framework.
  • In-process model: gecompileerde C#-functie die wordt uitgevoerd in hetzelfde proces als de Azure Functions-runtime.
  • C#-script: wordt voornamelijk gebruikt wanneer u C#-functies maakt in Azure Portal.

In het volgende voorbeeld ziet u een functie waarmee een bericht wordt verzonden met behulp van de uitvoerbinding naar alle verbonden clients. De newMessage is de naam van de methode die op elke client moet worden aangeroepen.

[Function(nameof(BroadcastToAll))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction BroadcastToAll([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    using var bodyReader = new StreamReader(req.Body);
    return new SignalRMessageAction("newMessage")
    {
        // broadcast to all the connected clients without specifying any connection, user or group.
        Arguments = new[] { bodyReader.ReadToEnd() },
    };
}

Dit zijn bindingsgegevens in het function.json-bestand :

Voorbeeld function.json:

{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
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]
        });
    }
});

Volledige PowerShell-voorbeelden zijn in behandeling.

Dit is de Python-code:

def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    signalROutput.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ message ]
    }))
@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;
}

Naar een gebruiker verzenden

U kunt een bericht alleen verzenden naar verbindingen die zijn geverifieerd voor een gebruiker door de gebruikers-id in te stellen in het SignalR-bericht.

[Function(nameof(SendToUser))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction SendToUser([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    using var bodyReader = new StreamReader(req.Body);
    return new SignalRMessageAction("newMessage")
    {
        Arguments = new[] { bodyReader.ReadToEnd() },
        UserId = "userToSend",
    };
}

Dit zijn bindingsgegevens in het function.json-bestand :

Voorbeeld function.json:

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

Volledige PowerShell-voorbeelden zijn in behandeling.

Dit is de Python-code:

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 ]
    }))
@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;
}
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",
        });
    }
});

Verzenden naar een groep

U kunt een bericht alleen verzenden naar verbindingen die aan een groep zijn toegevoegd door de groepsnaam in te stellen in het SignalR-bericht.

[Function(nameof(SendToGroup))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction SendToGroup([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    using var bodyReader = new StreamReader(req.Body);
    return new SignalRMessageAction("newMessage")
    {
        Arguments = new[] { bodyReader.ReadToEnd() },
        GroupName = "groupToSend"
    };
}

Dit zijn bindingsgegevens in het function.json-bestand :

Voorbeeld function.json:

{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
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",
        });
    }
});

Volledige PowerShell-voorbeelden zijn in behandeling.

Dit is de Python-code:

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 ]
    }))
@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;
}

Groepsbeheer

Met SignalR Service kunnen gebruikers of verbindingen worden toegevoegd aan groepen. Berichten kunnen vervolgens naar een groep worden verzonden. U kunt de SignalR uitvoerbinding gebruiken om groepen te beheren.

Geef SignalRGroupActionType op om een lid toe te voegen of te verwijderen. In het volgende voorbeeld wordt een gebruiker uit een groep verwijderd.

[Function(nameof(RemoveFromGroup))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRGroupAction RemoveFromGroup([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
    return new SignalRGroupAction(SignalRGroupActionType.Remove)
    {
        GroupName = "group1",
        UserId = "user1"
    };
}

Notitie

Als u de ClaimsPrincipal juiste afhankelijkheden wilt hebben, moet u de verificatie-instellingen in Azure Functions hebben geconfigureerd.

Dit zijn bindingsgegevens in het function.json-bestand :

Voorbeeld function.json:

{
  "type": "signalR",
  "name": "signalROutput",
  "hubName": "hubName1",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}
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"
        });
    }
});

Volledige PowerShell-voorbeelden zijn in behandeling.

In het volgende voorbeeld wordt een gebruiker aan een groep toegevoegd.

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

In het volgende voorbeeld wordt een gebruiker uit een groep verwijderd.

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

In het volgende voorbeeld wordt een gebruiker aan een groep toegevoegd.

@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;
}

In het volgende voorbeeld wordt een gebruiker uit een groep verwijderd.

@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;
}

Kenmerken

Zowel in-processals geïsoleerde werkproces C#-bibliotheken gebruiken kenmerk om de functie te definiëren. C#-script maakt in plaats daarvan gebruik van een function.json configuratiebestand.

In de volgende tabel worden de eigenschappen van het SignalROutput kenmerk uitgelegd.

Kenmerkeigenschap Beschrijving
HubName Deze waarde moet worden ingesteld op de naam van de SignalR-hub waarvoor de verbindingsgegevens worden gegenereerd.
ConnectionStringSetting De naam van de app-instelling of instellingenverzameling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.

Aantekeningen

In de volgende tabel worden de ondersteunde instellingen voor de SignalROutput aantekening uitgelegd.

Instelling Beschrijving
naam Variabelenaam die wordt gebruikt in functiecode voor verbindingsinformatieobject.
hubName Deze waarde moet worden ingesteld op de naam van de SignalR-hub waarvoor de verbindingsgegevens worden gegenereerd.
connectionStringSetting De naam van de app-instelling of instellingenverzameling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.

Configuratie

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u in het function.json-bestand hebt ingesteld.

function.json-eigenschap Beschrijving
soort Moet worden ingesteld op signalR.
richting Moet worden ingesteld op out.
naam Variabelenaam die wordt gebruikt in functiecode voor verbindingsinformatieobject.
hubName Deze waarde moet worden ingesteld op de naam van de SignalR-hub waarvoor de verbindingsgegevens worden gegenereerd.
connectionStringSetting De naam van de app-instelling of instellingenverzameling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.

Wanneer u lokaal ontwikkelt, voegt u uw toepassingsinstellingen toe aan het local.settings.json-bestand in de Values verzameling.

Gebruik

Connections

De connectionStringSetting eigenschap wordt ingesteld op een sleutel in applicatieinstellingen die een waarde teruggeeft die door de Functions-runtime wordt gebruikt om verbinding te maken met de Azure SignalR Service-instantie die door de extensie wordt gebruikt. De waarde van deze verbindingseigenschapsinstelling hangt af van het type verbinding:

  • Beheerde identiteitsverbinding: De connectionStringSetting eigenschap wordt <CONNECTION_NAME_PREFIX> gedeeld door een groep instellingen die samen een identiteitsgebaseerde verbinding met het service-eindpunt definiëren. Voor meer informatie, zie Definieer identiteitsverbindingen.
  • Key Vault-referentie: De connectionStringSetting property-instelling geeft een Azure Key Vault-referentie terug naar de locatie waar de verbindingsreeks centraal wordt onderhouden. Voor meer informatie, zie Define Key Vault-verbindingen.
  • App Configuration referentie: De connectionStringSetting property-instelling geeft een Azure App Configuration-referentie terug die een verbindingsreeks of een Key Vault-referentie teruggeeft. Voor meer informatie, zie Azure App Configuration in het artikel over verbindingen.
  • Connection string: De connectionStringSetting property-instelling geeft de daadwerkelijke SignalR service verbindingsreeks terug. Omdat de verbindingsreeks gedeelde geheime sleutels bevat, zou je moeten overwegen een managed identity-verbinding te gebruiken, waar mogelijk. Voor meer informatie, zie Verbindingen definiëren.

Voor meer informatie over bindingsverbindingen, zie Verbinding beheren in Azure Functions. Om een verbindingsreeks te verkrijgen, volgt u de stappen die worden getoond bij Hoe je verbindingsreekss krijgt.

De Functions-host zoekt naar een sleutel of sleutelvoorvoegsel die wordt genoemd AzureSignalRConnectionString bij het verbinden met je SignalR-dienst. Anders gebruikt het de sleutelwaarde die in connectionStringSetting is gezet om de vereiste verbindingsinformatie te verkrijgen.

Volgende stappen