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
  • Verbinding maken ed clients in een opgegeven groep
  • Verbinding maken van clients die zijn geverifieerd bij 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. Geïsoleerd werkproces is vereist voor de ondersteuning van C#-functies die worden uitgevoerd op LTS- en niet-LTS-versies .NET en .NET Framework.
  • In-process model: gecompileerde C#-functie die wordt uitgevoerd in hetzelfde proces als de 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.
Verbinding maken ionStringSetting De naam van de app-instelling 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 Omschrijving
name 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 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
type Moet worden ingesteld op signalR.
direction Moet worden ingesteld op out.
name 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 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.

Volgende stappen