Udostępnij za pośrednictwem


Powiązanie wyjściowe usługi SignalR Service dla usługi Azure Functions

Użyj powiązania danych wyjściowych usługi SignalR , aby wysłać co najmniej jeden komunikat przy użyciu usługi Azure SignalR Service. Możesz rozgłasić komunikat do:

  • Wszyscy połączeni klienci
  • Klienci połączeni w określonej grupie
  • Klienci połączeni uwierzytelnieni dla określonego użytkownika

Powiązanie wyjściowe umożliwia również zarządzanie grupami, takimi jak dodawanie klienta lub użytkownika do grupy, usuwanie klienta lub użytkownika z grupy.

Aby uzyskać informacje na temat konfiguracji i konfiguracji, zobacz omówienie.

Przykład

Emisja do wszystkich klientów

Funkcję języka C# można utworzyć przy użyciu jednego z następujących trybów języka C#:

  • Model izolowanego procesu roboczego: skompilowana funkcja języka C#, która jest uruchamiana w procesie roboczym izolowanym od środowiska uruchomieniowego. Proces izolowanego procesu roboczego jest wymagany do obsługi funkcji języka C# uruchomionych w wersjach LTS i innych niż LTS platformy .NET oraz programu .NET Framework.
  • Model przetwarzania: skompilowana funkcja języka C#, która działa w tym samym procesie co środowisko uruchomieniowe usługi Functions.
  • Skrypt języka C#: używany głównie podczas tworzenia funkcji języka C# w witrynie Azure Portal.

Ważne

Wsparcie zostanie zakończone dla modelu procesu 10 listopada 2026 r. Zdecydowanie zalecamy przeprowadzenie migracji aplikacji do izolowanego modelu procesu roboczego w celu uzyskania pełnej obsługi.

W poniższym przykładzie pokazano funkcję, która wysyła komunikat przy użyciu powiązania wyjściowego do wszystkich połączonych klientów. NewMessage to nazwa metody, która ma być wywoływana na każdym kliencie.

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

Oto dane powiązania w pliku function.json :

Przykład 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]
        });
    }
});

Kompletne przykłady programu PowerShell są oczekujące.

Oto kod języka Python:

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

Wyślij do użytkownika

Komunikat można wysłać tylko do połączeń, które zostały uwierzytelnione dla użytkownika, ustawiając identyfikator użytkownika w komunikacie usługi SignalR.

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

Oto dane powiązania w pliku function.json :

Przykład function.json:

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

Kompletne przykłady programu PowerShell są oczekujące.

Oto kod języka 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 ]
    }))
@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",
        });
    }
});

Wysyłanie do grupy

Komunikat można wysłać tylko do połączeń, które zostały dodane do grupy, ustawiając nazwę grupy w komunikacie usługi SignalR.

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

Oto dane powiązania w pliku function.json :

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

Kompletne przykłady programu PowerShell są oczekujące.

Oto kod języka 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 ]
    }))
@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;
}

Zarządzanie grupami

Usługa SignalR Service umożliwia dodawanie użytkowników lub połączeń do grup. Komunikaty można następnie wysyłać do grupy. Do zarządzania grupami można użyć powiązania wyjściowego SignalR .

Określ SignalRGroupActionType , aby dodać lub usunąć członka. Poniższy przykład usuwa użytkownika z grupy.

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

Uwaga

Aby uzyskać ClaimsPrincipal poprawne powiązanie, musisz skonfigurować ustawienia uwierzytelniania w usłudze Azure Functions.

Oto dane powiązania w pliku function.json :

Przykład 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"
        });
    }
});

Kompletne przykłady programu PowerShell są oczekujące.

Poniższy przykład dodaje użytkownika do grupy.

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

Poniższy przykład usuwa użytkownika z grupy.

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

Poniższy przykład dodaje użytkownika do grupy.

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

Poniższy przykład usuwa użytkownika z grupy.

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

Atrybuty

Zarówno w procesie przetwarzania, jak i izolowanym procesie roboczym biblioteki języka C# używają atrybutu do zdefiniowania funkcji. Zamiast tego skrypt języka C# używa pliku konfiguracji function.json.

W poniższej tabeli opisano właściwości atrybutu SignalROutput .

Właściwość atrybutu opis
Nazwa centrum Ta wartość musi być ustawiona na nazwę centrum SignalR, dla którego są generowane informacje o połączeniu.
ConnectionStringSetting Nazwa kolekcji ustawień lub ustawień aplikacji, która zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.

Adnotacje

W poniższej tabeli opisano obsługiwane ustawienia adnotacji SignalROutput .

Ustawienie opis
name Nazwa zmiennej używana w kodzie funkcji dla obiektu informacji o połączeniu.
hubName Ta wartość musi być ustawiona na nazwę centrum SignalR, dla którego są generowane informacje o połączeniu.
connectionStringSetting Nazwa kolekcji ustawień lub ustawień aplikacji, która zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.

Konfigurowanie

W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w pliku function.json .

właściwość function.json opis
type Musi być ustawiona wartość signalR.
direction Musi być ustawiona wartość out.
name Nazwa zmiennej używana w kodzie funkcji dla obiektu informacji o połączeniu.
hubName Ta wartość musi być ustawiona na nazwę centrum SignalR, dla którego są generowane informacje o połączeniu.
connectionStringSetting Nazwa kolekcji ustawień lub ustawień aplikacji, która zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.

Podczas tworzenia aplikacji lokalnie dodaj ustawienia aplikacji w pliku local.settings.json w kolekcji Values .

Użycie

W celu zapewnienia optymalnego bezpieczeństwa aplikacja funkcji powinna używać zarządzanych tożsamości podczas nawiązywania połączenia z usługą Azure SignalR, a nie przy użyciu parametry połączenia, która zawiera wspólny klucz tajny. Aby uzyskać więcej informacji, zobacz Autoryzowanie żądań do zasobów usługi Azure SignalR Service za pomocą tożsamości zarządzanych firmy Microsoft Entra.

Następne kroki