Číst v angličtině

Sdílet prostřednictvím


Výstupní vazba služby SignalR pro Azure Functions

Volba programovacího jazyka

Pomocí výstupní vazby SignalR odešlete jednu nebo více zpráv pomocí služby Azure SignalR. Zprávu můžete vysílat na:

  • Všichni připojení klienti
  • Připojení klienti v zadané skupině
  • Připojení klienti ověření pro konkrétního uživatele

Výstupní vazba také umožňuje spravovat skupiny, jako je přidání klienta nebo uživatele do skupiny, odebrání klienta nebo uživatele ze skupiny.

Informace o nastavení a konfiguraci najdete v přehledu.

Příklad

Všesměrové vysílání pro všechny klienty

Funkci jazyka C# je možné vytvořit pomocí jednoho z následujících režimů jazyka C#:

  • Izolovaný model pracovního procesu: Kompilovaná funkce jazyka C#, která běží v pracovním procesu, který je izolovaný od modulu runtime. Izolovaný pracovní proces je nutný pro podporu funkcí C# spuštěných na LTS a jiných verzích než LTS .NET a rozhraní .NET Framework.
  • Model v procesu: Zkompilovaná funkce jazyka C#, která běží ve stejném procesu jako modul runtime služby Functions.
  • Skript jazyka C#: Používá se především při vytváření funkcí jazyka C# na webu Azure Portal.

Následující příklad ukazuje funkci, která odešle zprávu pomocí výstupní vazby všem připojeným klientům. NewMessage je název metody, která se má vyvolat na každém klientovi.

C#
[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() },
    };
}

Tady jsou data vazby v souboru function.json :

Příklad 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]
        });
    }
});

Dokončené příklady PowerShellu čekají na vyřízení.

Tady je kód Pythonu:

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

Odeslat uživateli

Zprávu můžete odeslat pouze na připojení, která byla ověřena uživateli nastavením ID uživatele ve zprávě SignalR.

C#
[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",
    };
}

Tady jsou data vazby v souboru function.json :

Příklad function.json:

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

Dokončené příklady PowerShellu čekají na vyřízení.

Tady je kód Pythonu:

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

Odeslání do skupiny

Zprávu můžete odeslat pouze do připojení, která byla přidána do skupiny, nastavením názvu skupiny ve zprávě SignalR.

C#
[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"
    };
}

Tady jsou data vazby v souboru function.json :

Příklad 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",
        });
    }
});

Dokončené příklady PowerShellu čekají na vyřízení.

Tady je kód Pythonu:

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

Správa skupin

Služba SignalR umožňuje přidávat uživatele nebo připojení ke skupinám. Zprávy se pak dají odeslat do skupiny. Výstupní vazbu můžete použít SignalR ke správě skupin.

Zadejte SignalRGroupActionType , jestli chcete přidat nebo odebrat člena. Následující příklad odebere uživatele ze skupiny.

C#
[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"
    };
}

Poznámka

Abyste získali ClaimsPrincipal správnou vazbu, musíte mít nakonfigurovaná nastavení ověřování ve službě Azure Functions.

Tady jsou data vazby v souboru function.json :

Příklad 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"
        });
    }
});

Dokončené příklady PowerShellu čekají na vyřízení.

Následující příklad přidá uživatele do skupiny.

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

Následující příklad odebere uživatele ze skupiny.

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

Následující příklad přidá uživatele do skupiny.

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

Následující příklad odebere uživatele ze skupiny.

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

Atributy

Knihovny C# v procesu i izolovaného pracovního procesu používají k definování funkce atribut. Skript jazyka C# místo toho používá konfigurační soubor function.json.

Následující tabulka vysvětluje vlastnosti atributu SignalROutput .

Vlastnost atributu Popis
HubName Tato hodnota musí být nastavena na název centra SignalR, pro které se generují informace o připojení.
ConnectionStringSetting Název nastavení aplikace nebo kolekce nastavení, která obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.

Poznámky

Následující tabulka vysvětluje podporovaná nastavení poznámky SignalROutput .

Nastavení Description
Jméno Název proměnné použitý v kódu funkce pro objekt informace o připojení.
hubName Tato hodnota musí být nastavena na název centra SignalR, pro které se generují informace o připojení.
connectionStringSetting Název nastavení aplikace nebo kolekce nastavení, která obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.

Konfigurace

Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json .

vlastnost function.json Popis
type Musí být nastavena na signalRhodnotu .
direction Musí být nastavena na outhodnotu .
Jméno Název proměnné použitý v kódu funkce pro objekt informace o připojení.
hubName Tato hodnota musí být nastavena na název centra SignalR, pro které se generují informace o připojení.
connectionStringSetting Název nastavení aplikace nebo kolekce nastavení, která obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.

Při místním vývoji přidejte nastavení aplikace do souboru local.settings.json v kolekci Values .

Využití

Pro zajištění optimálního zabezpečení by vaše aplikace funkcí měla při připojování ke službě Azure SignalR místo použití připojovací řetězec, která obsahuje sdílený tajný klíč, používat spravované idenity. Další informace najdete v tématu Autorizace požadavků na prostředky služby Azure SignalR Service s využitím spravovaných identit Microsoft Entra.

Další kroky