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

Mielőtt egy ügyfél csatlakozni tud az Azure SignalR szolgáltatáshoz, le kell kérnie a szolgáltatásvégpont URL-címét és egy érvényes hozzáférési jogkivonatot. A SignalR Csatlakozás ionInfo bemeneti kötés létrehozza a SignalR szolgáltatás végpontJÁNAK URL-címét és egy érvényes jogkivonatot, amely a szolgáltatáshoz való csatlakozáshoz használatos. A jogkivonat időkorlátos, és egy adott felhasználó hitelesítésére használható egy kapcsolathoz. Ezért nem szabad gyorsítótárba helyeznie a jogkivonatot, és nem szabad megosztania az ügyfelek között. A SignalR Csatlakozás ionInfo-t általában HTTP-eseményindítóval használja az ügyfelek számára a kapcsolati adatok lekéréséhez.

Ha többet szeretne tudni arról, hogy hogyan használhatja ezt a kötést egy SignalR-ügyfél SDK-val kompatibilis "egyeztetési" függvény létrehozásához, tekintse meg az Azure Functions fejlesztésével és az Azure SignalR Szolgáltatással való konfigurálásáról szóló cikket. A beállítással és a konfigurációval kapcsolatos információkért tekintse meg az áttekintést.

Példa

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 C# függvényt mutat be, amely a bemeneti kötéssel szerzi be a SignalR kapcsolati adatait, és HTTP-n keresztül adja vissza.

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

Az alábbi példa egy SignalR kapcsolatinformációs bemeneti kötést mutat be egy function.json fájlban, és egy függvényt, amely a kötést használja a kapcsolati adatok visszaadásához.

Az alábbi kötési adatok a function.json fájlban lévő példához:

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

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

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

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

Az alábbi példa egy SignalR-kapcsolatadatok bemeneti kötését mutatja be egy function.json fájlban, valamint egy Python-függvényt , amely a kötést használja a kapcsolati adatok visszaadásához.

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

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

Az alábbi példa egy Java-függvényt mutat be, amely a bemeneti kötés használatával szerzi be a SignalR kapcsolati adatait, és HTTP-en keresztül adja vissza.

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

Használat

Hitelesített jogkivonatok

Amikor egy hitelesített ügyfél aktiválja a függvényt, hozzáadhat egy felhasználói azonosító jogcímet a létrehozott jogkivonathoz. Az App Service-hitelesítéssel egyszerűen hozzáadhat hitelesítést egy függvényalkalmazáshoz.

Az App Service-hitelesítés beállítja a http-fejléceket, x-ms-client-principal-id amelyek x-ms-client-principal-name tartalmazzák a hitelesített felhasználó ügyfélnév-azonosítóját és nevét.

A kötés tulajdonságát a fejlécből származó értékre állíthatja UserId egy kötési kifejezéssel: {headers.x-ms-client-principal-id} vagy {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;
}

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

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

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

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

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

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

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

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

Attribútumtulajdonság Leírás
HubName Szükséges. A központ neve.
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
UserId Opcionális. A SignalR-kapcsolat felhasználói azonosítója. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
IdToken Opcionális. Egy JWT-jogkivonat, amelynek jogcímei hozzá lesznek adva a felhasználói jogcímhez. A Jogcímtípuslistával együtt kell használni. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
ClaimTypeList Opcionális. A jogcímtípusok listája, amely az IdTokenben szűri a jogcímeket.

Jegyzetek

Az alábbi táblázat a széljegyzet támogatott beállításait SignalRConnectionInfoInput 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 Szükséges. A központ neve.
connectionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString
Userid Opcionális. A SignalR-kapcsolat felhasználói azonosítója. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
idToken Opcionális. Egy JWT-jogkivonat, amelynek jogcímei hozzá lesznek adva a felhasználói jogcímhez. A jogcímtípuslistával együtt kell használni. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
claimTypeList Opcionális. A jogcímtípusok listája, amely az idTokenben szűri a jogcímeket.

Jegyzetek

Az alábbi táblázat a széljegyzet támogatott beállításait SignalRConnectionInfoInput 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 Szükséges. A központ neve.
connectionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString
Userid Opcionális. A SignalR-kapcsolat felhasználói azonosítója. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
idToken Opcionális. Egy JWT-jogkivonat, amelynek jogcímei hozzá lesznek adva a felhasználói jogcímhez. A jogcímtípuslistával együtt kell használni. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
claimTypeList Opcionális. A jogcímtípusok listája, amely az idTokenben szűri a jogcímeket.

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 signalRConnectionInfokövetkezőnek kell lennie: .
direction A beállításnak a inkövetkezőnek kell lennie: .
hubName Szükséges. A központ neve.
connectionStringSetting A SignalR service kapcsolati sztring-t tartalmazó alkalmazásbeállítás neve, amely alapértelmezés szerint a következő.AzureSignalRConnectionString
Userid Opcionális. A SignalR-kapcsolat felhasználói azonosítója. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
idToken Opcionális. Egy JWT-jogkivonat, amelynek jogcímei hozzá lesznek adva a felhasználói jogcímhez. A jogcímtípuslistával együtt kell használni. Egy kötési kifejezéssel egy HTTP-kérelemfejléchez vagy -lekérdezéshez kötheti az értéket.
claimTypeList Opcionális. A jogcímtípusok listája, amely az idTokenben szűri a jogcímeket.

Kötési kifejezések HTTP-eseményindítóhoz

Gyakori forgatókönyv, hogy a SignalR bemeneti kötés egyes attribútumainak értékei HTTP-kérésekből származnak. Ezért bemutatjuk, hogyan köthet értékeket HTTP-kérésekből a SignalR bemeneti kötési attribútumaihoz kötési kifejezéssel.

HTTP-metaadatok típusa Kötési kifejezés formátuma Leírás Példa
HTTP-kérelem lekérdezése {query.QUERY_PARAMETER_NAME} A megfelelő lekérdezési paraméter értékét attribútumhoz köti {query.userName}
HTTP-kérelem fejléce {headers.HEADER_NAME} Egy fejléc értékét attribútumhoz köti {headers.token}

Következő lépések