SignalR-szolgáltatás kimeneti kötése az Azure Functionshez

A SignalR kimeneti kötés használatával küldjön egy vagy több üzenetet az Azure SignalR Service használatával. Üzenetet a következő címzettek számára közvetíthet:

  • Minden csatlakoztatott ügyfél
  • Csatlakozás ügyfelek egy adott csoportban
  • Csatlakozás egy adott felhasználónak hitelesített ügyfelek

A kimeneti kötés lehetővé teszi a csoportok kezelését is, például ügyfél vagy felhasználó hozzáadását egy csoporthoz, és eltávolíthat egy ügyfelet vagy felhasználót egy csoportból.

A beállítással és a konfigurációval kapcsolatos információkért tekintse meg az áttekintést.

Példa

Közvetítés az összes ügyfélnek

A C#-függvények a következő C#-módok egyikével hozhatók létre:

  • Izolált feldolgozómodell: Lefordított C# függvény, amely a futtatókörnyezettől elkülönített feldolgozói folyamatban fut. Izolált feldolgozói folyamat szükséges az LTS- és nem LTS-verziókon futó C#-függvények támogatásához .NET és .NET-keretrendszer.
  • Folyamaton belüli modell: Lefordított C# függvény, amely ugyanabban a folyamatban fut, mint a Functions-futtatókörnyezet.
  • C#-szkript: Elsősorban C#-függvények Azure Portalon való létrehozásakor használatos.

Az alábbi példa egy függvényt mutat be, amely a kimeneti kötéssel üzenetet küld az összes csatlakoztatott ügyfélnek. A newMessage az egyes ügyfeleken meghívandó metódus neve.

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

Az alábbi kötési adatok a function.json fájlban:

Példa 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]
        });
    }
});

A Teljes PowerShell-példák függőben vannak.

A Python-kód a következő:

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

Küldés felhasználónak

A SignalR-üzenetben megadott felhasználói azonosító beállításával csak olyan kapcsolatoknak küldhet üzenetet, amelyek hitelesítése megtörtént a felhasználó számára.

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

Az alábbi kötési adatok a function.json fájlban:

Példa function.json:

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

A Teljes PowerShell-példák függőben vannak.

A Python-kód a következő:

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

Küldés csoportnak

Csak a csoporthoz hozzáadott kapcsolatoknak küldhet üzenetet a SignalR üzenetben a csoport nevének beállításával.

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

Az alábbi kötési adatok a function.json fájlban:

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

A Teljes PowerShell-példák függőben vannak.

A Python-kód a következő:

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

Csoportkezelés

A SignalR szolgáltatás lehetővé teszi a felhasználók vagy kapcsolatok csoportokhoz való hozzáadását. Ezután üzeneteket küldhet egy csoportnak. A kimeneti kötéssel kezelheti a SignalR csoportokat.

Tag hozzáadásának vagy eltávolításának megadása SignalRGroupActionType . Az alábbi példa eltávolít egy felhasználót egy csoportból.

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

Feljegyzés

A helyes kötés eléréséhez ClaimsPrincipal konfigurálnia kell a hitelesítési beállításokat az Azure Functionsben.

Az alábbi kötési adatok a function.json fájlban:

Példa 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"
        });
    }
});

A Teljes PowerShell-példák függőben vannak.

Az alábbi példa egy felhasználót ad hozzá egy csoporthoz.

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

Az alábbi példa eltávolít egy felhasználót egy csoportból.

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

Az alábbi példa egy felhasználót ad hozzá egy csoporthoz.

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

Az alábbi példa eltávolít egy felhasználót egy csoportból.

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

Attribútumok

A folyamaton belüli és az izolált feldolgozói folyamat C#-kódtárai attribútummal határozzák meg a függvényt. A C#-szkript ehelyett function.json konfigurációs fájlt használ.

Az alábbi táblázat az attribútum tulajdonságait SignalROutput ismerteti.

Attribútumtulajdonság Leírás
HubName Ezt az értéket annak a SignalR-központnak a nevére kell állítani, amelyhez a kapcsolati információk létrejönnek.
Csatlakozás ionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString

Jegyzetek

Az alábbi táblázat a széljegyzet támogatott beállításait SignalROutput ismerteti.

Beállítás Leírás
név A kapcsolati információs objektum függvénykódjában használt változónév.
hubName Ezt az értéket annak a SignalR-központnak a nevére kell állítani, amelyhez a kapcsolati információk létrejönnek.
connectionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString

Konfiguráció

Az alábbi táblázat a function.json fájlban beállított kötéskonfigurációs tulajdonságokat ismerteti.

function.json tulajdonság Leírás
type A beállításnak a signalRkövetkezőnek kell lennie: .
direction A beállításnak a outkövetkezőnek kell lennie: .
név A kapcsolati információs objektum függvénykódjában használt változónév.
hubName Ezt az értéket annak a SignalR-központnak a nevére kell állítani, amelyhez a kapcsolati információk létrejönnek.
connectionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString

Helyi fejlesztéskor adja hozzá az alkalmazásbeállításokat a gyűjtemény local.settings.json fájljáhozValues.

Következő lépések