Udostępnij za pośrednictwem


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

Aby klient mógł nawiązać połączenie z usługą Azure SignalR Service, musi pobrać adres URL punktu końcowego usługi i prawidłowy token dostępu. Powiązanie wejściowe SignalRConnectionInfo tworzy adres URL punktu końcowego usługi SignalR Service i prawidłowy token używany do nawiązywania połączenia z usługą. Token jest ograniczony czasowo i może służyć do uwierzytelniania określonego użytkownika w połączeniu. W związku z tym nie należy buforowania tokenu ani udostępniania go między klientami. Zazwyczaj do pobierania informacji o połączeniu klienci używają polecenia SignalRConnectionInfo z wyzwalaczem HTTP.

Aby uzyskać więcej informacji na temat korzystania z tego powiązania w celu utworzenia funkcji "negotiate", która jest zgodna z zestawem SDK klienta usługi SignalR, zobacz Programowanie i konfigurowanie usługi Azure Functions za pomocą usługi Azure SignalR Service. Aby uzyskać informacje na temat konfiguracji i konfiguracji, zobacz omówienie.

Przykład

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ę języka C#, która uzyskuje informacje o połączeniu usługi SignalR przy użyciu powiązania wejściowego i zwraca ją za pośrednictwem protokołu HTTP.

[Function(nameof(Negotiate))]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
    [SignalRConnectionInfoInput(HubName = "serverless")] string connectionInfo)
{
    // The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
    return connectionInfo;
}

Poniższy przykład przedstawia powiązanie wejściowe informacji o połączeniu usługi SignalR w pliku function.json i funkcję, która używa powiązania w celu zwrócenia informacji o połączeniu.

Oto dane powiązania dla przykładu w pliku function.json :

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Oto kod JavaScript:

const { app, input } = require('@azure/functions');

const inputSignalR = input.generic({
    type: 'signalRConnectionInfo',
    name: 'connectionInfo',
    hubName: 'hubName1',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

app.post('negotiate', {
    authLevel: 'function',
    handler: (request, context) => {
        return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
    },
    route: 'negotiate',
    extraInputs: [inputSignalR],
});

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

W poniższym przykładzie przedstawiono powiązanie wejściowe informacji o połączeniu usługi SignalR w pliku function.json i funkcję języka Python, która używa powiązania w celu zwrócenia informacji o połączeniu.

Oto kod języka Python:

def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
    return func.HttpResponse(
        connectionInfoJson,
        status_code=200,
        headers={
            'Content-type': 'application/json'
        }
    )

Poniższy przykład przedstawia funkcję Języka Java, która uzyskuje informacje o połączeniu usługi SignalR przy użyciu powiązania wejściowego i zwraca je za pośrednictwem protokołu HTTP.

@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(
            name = "connectionInfo",
            HubName = "hubName1") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

Użycie

Uwierzytelnione tokeny

Po wyzwoleniu funkcji uwierzytelnionego klienta można dodać oświadczenie identyfikatora użytkownika do wygenerowanego tokenu. Uwierzytelnianie można łatwo dodać do aplikacji funkcji przy użyciu uwierzytelniania usługi App Service.

Uwierzytelnianie usługi App Service ustawia nagłówki HTTP o nazwie x-ms-client-principal-id i x-ms-client-principal-name zawierają odpowiednio identyfikator podmiotu zabezpieczeń klienta i nazwę uwierzytelnionego użytkownika.

Właściwość powiązania można ustawić UserId na wartość z nagłówka przy użyciu wyrażenia powiązania: {headers.x-ms-client-principal-id} lub {headers.x-ms-client-principal-name}.

[Function("Negotiate")]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
    [SignalRConnectionInfoInput(HubName = "hubName1", UserId = "{headers.x-ms-client-principal-id}")] string connectionInfo)
{
    // The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
    return connectionInfo;
}
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST, HttpMethod.GET },
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(name = "connectionInfo", hubName = "hubName1", userId = "{headers.x-ms-signalr-userid}") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

Oto dane powiązania w pliku function.json :

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Oto kod JavaScript:

const { app, input } = require('@azure/functions');

const inputSignalR = input.generic({
    type: 'signalRConnectionInfo',
    name: 'connectionInfo',
    hubName: 'hubName1',
    connectionStringSetting: 'AzureSignalRConnectionString',
    userId: '{headers.x-ms-client-principal-id}',
});

app.post('negotiate', {
    authLevel: 'function',
    handler: (request, context) => {
        return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
    },
    route: 'negotiate',
    extraInputs: [inputSignalR],
});

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

Oto kod języka Python:

def main(req: func.HttpRequest, connectionInfo: str) -> func.HttpResponse:
    # connectionInfo contains an access key token with a name identifier
    # claim set to the authenticated user
    return func.HttpResponse(
        connectionInfo,
        status_code=200,
        headers={
            'Content-type': 'application/json'
        }
    )
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(
            name = "connectionInfo",
            HubName = "hubName1",
            userId = "{headers.x-ms-client-principal-id}") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

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 SignalRConnectionInfoInput :

Właściwość atrybutu opis
Nazwa centrum Wymagany. Nazwa centrum.
ConnectionStringSetting Nazwa ustawienia aplikacji, które zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.
UserId Opcjonalny. Identyfikator użytkownika połączenia usługi SignalR. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
IdToken Opcjonalny. Token JWT, którego oświadczenia zostaną dodane do oświadczeń użytkownika. Należy go używać razem z claimTypeList. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
ClaimTypeList Opcjonalny. Lista typów oświadczeń, które filtruje oświadczenia w identyfikatorze IdToken .

Adnotacje

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

Ustawienie opis
name Nazwa zmiennej używana w kodzie funkcji dla obiektu informacji o połączeniu.
hubName Wymagany. Nazwa centrum.
connectionStringSetting Nazwa ustawienia aplikacji, które zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.
userId Opcjonalny. Identyfikator użytkownika połączenia usługi SignalR. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
idToken Opcjonalny. Token JWT, którego oświadczenia zostaną dodane do oświadczeń użytkownika. Należy go używać razem z claimTypeList. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
claimTypeList Opcjonalny. Lista typów oświadczeń, które filtruje oświadczenia w idToken .

Adnotacje

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

Ustawienie opis
name Nazwa zmiennej używana w kodzie funkcji dla obiektu informacji o połączeniu.
hubName Wymagany. Nazwa centrum.
connectionStringSetting Nazwa ustawienia aplikacji, które zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.
userId Opcjonalny. Identyfikator użytkownika połączenia usługi SignalR. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
idToken Opcjonalny. Token JWT, którego oświadczenia zostaną dodane do oświadczeń użytkownika. Należy go używać razem z claimTypeList. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
claimTypeList Opcjonalny. Lista typów oświadczeń, które filtruje oświadczenia w idToken .

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ść signalRConnectionInfo.
direction Musi być ustawiona wartość in.
hubName Wymagany. Nazwa centrum.
connectionStringSetting Nazwa ustawienia aplikacji, które zawiera parametry połączenia usługi SignalR Service, która jest domyślnie ustawiona na AzureSignalRConnectionString.
userId Opcjonalny. Identyfikator użytkownika połączenia usługi SignalR. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
idToken Opcjonalny. Token JWT, którego oświadczenia zostaną dodane do oświadczeń użytkownika. Należy go używać razem z claimTypeList. Możesz użyć wyrażenia powiązania, aby powiązać wartość z nagłówkiem lub zapytaniem żądania HTTP.
claimTypeList Opcjonalny. Lista typów oświadczeń, które filtruje oświadczenia w idToken .

Wyrażenia powiązań dla wyzwalacza HTTP

Jest to typowy scenariusz, w przypadku którego wartości niektórych atrybutów powiązania wejściowego usługi SignalR pochodzą z żądań HTTP. W związku z tym pokazujemy, jak powiązać wartości z żądań HTTP z atrybutami powiązania danych wejściowych usługi SignalR za pomocą wyrażenia powiązania.

Typ metadanych HTTP Format wyrażenia powiązania opis Przykład
Zapytanie żądania HTTP {query.QUERY_PARAMETER_NAME} Wiąże wartość odpowiedniego parametru zapytania z atrybutem {query.userName}
Nagłówek żądania HTTP {headers.HEADER_NAME} Wiąże wartość nagłówka z atrybutem {headers.token}

Następne kroki