Vstupní vazba služby SignalR pro Azure Functions
Než se klient může připojit ke službě Azure SignalR, musí načíst adresu URL koncového bodu služby a platný přístupový token. Vstupní vazba SignalRConnectionInfo vytvoří adresu URL koncového bodu služby SignalR a platný token, který se používá pro připojení ke službě. Token je časově omezený a dá se použít k ověření konkrétního uživatele pro připojení. Token byste proto neměli ukládat do mezipaměti ani ho sdílet mezi klienty. Obvykle používáte SignalRConnectionInfo s triggerem HTTP pro klienty k načtení informací o připojení.
Další informace o tom, jak pomocí této vazby vytvořit funkci Negotiate, která je kompatibilní s klientskou sadou SDK služby SignalR, najdete v tématu Vývoj a konfigurace služby Azure Functions pomocí služby Azure SignalR. Informace o nastavení a konfiguraci najdete v přehledu.
Příklad
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.
Důležité
Podpora modelu v procesu skončí 10. listopadu 2026. Důrazně doporučujeme migrovat aplikace do izolovaného modelu pracovního procesu pro plnou podporu.
Následující příklad ukazuje funkci jazyka C#, která získává informace o připojení SignalR pomocí vstupní vazby a vrací ji přes protokol 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;
}
Následující příklad ukazuje vstupní vazbu informací o připojení SignalR v souboru function.json a funkci, která používá vazbu k vrácení informací o připojení.
Tady je vazba dat pro příklad v souboru function.json :
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
Tady je javascriptový kód:
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],
});
Dokončené příklady PowerShellu čekají na vyřízení.
Následující příklad ukazuje vstupní vazbu informací o připojení SignalR v souboru function.json a funkci Pythonu, která používá vazbu k vrácení informací o připojení.
Tady je kód Pythonu:
def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
return func.HttpResponse(
connectionInfoJson,
status_code=200,
headers={
'Content-type': 'application/json'
}
)
Následující příklad ukazuje funkci Java, která získává informace o připojení SignalR pomocí vstupní vazby a vrací ji přes 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;
}
Upozorňující
Pro zjednodušení vynecháme části ověřování a autorizace v této ukázce. V důsledku toho je tento koncový bod veřejně přístupný bez jakýchkoli omezení. Pokud chcete zajistit zabezpečení koncového bodu vyjednávání, měli byste implementovat vhodné mechanismy ověřování a autorizace na základě vašich konkrétních požadavků. Pokyny k ochraně koncových bodů HTTP najdete v následujících článcích:
Využití
Ověřené tokeny
Když ověřený klient aktivuje funkci, můžete do vygenerovaného tokenu přidat deklaraci ID uživatele. Ověřování můžete snadno přidat do aplikace funkcí pomocí ověřování pomocí služby App Service.
Ověřování služby App Service nastaví hlavičky HTTP pojmenované x-ms-client-principal-id
a x-ms-client-principal-name
obsahují ID a název instančního objektu ověřeného uživatele.
Vlastnost vazby na hodnotu můžete nastavit UserId
z hlavičky pomocí vazbového výrazu: {headers.x-ms-client-principal-id}
nebo {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;
}
Tady jsou data vazby v souboru 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"
}
Tady je javascriptový kód:
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],
});
Dokončené příklady PowerShellu čekají na vyřízení.
Tady je kód Pythonu:
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;
}
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 SignalRConnectionInfoInput
:
Poznámky
Následující tabulka vysvětluje podporovaná nastavení poznámky SignalRConnectionInfoInput
.
Poznámky
Následující tabulka vysvětluje podporovaná nastavení poznámky SignalRConnectionInfoInput
.
Konfigurace
Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json .
Vazbové výrazy pro trigger HTTP
Jedná se o běžný scénář, kdy hodnoty některých atributů vstupní vazby SignalR pocházejí z požadavků HTTP. Proto si ukážeme, jak vytvořit vazbu hodnot z požadavků HTTP na atributy vstupní vazby SignalR prostřednictvím vazbového výrazu.
Typ metadat HTTP | Formát vazby výrazu | Popis | Příklad |
---|---|---|---|
Dotaz požadavku HTTP | {query.QUERY_PARAMETER_NAME} |
Vytvoří vazbu hodnoty odpovídajícího parametru dotazu na atribut. | {query.userName} |
Hlavička požadavku HTTP | {headers.HEADER_NAME} |
Vytvoří vazbu hodnoty hlavičky na atribut. | {headers.token} |