SignalR Service-indatabindning för Azure Functions
Innan en klient kan ansluta till Azure SignalR Service måste den hämta tjänstens slutpunkts-URL och en giltig åtkomsttoken. SignalRConnectionInfo-indatabindningen genererar signalR-tjänstens slutpunkts-URL och en giltig token som används för att ansluta till tjänsten. Token är tidsbegränsad och kan användas för att autentisera en specifik användare till en anslutning. Därför bör du inte cachelagrat token eller dela den mellan klienter. Vanligtvis använder du SignalRConnectionInfo med HTTP-utlösare för klienter för att hämta anslutningsinformationen.
Mer information om hur du använder den här bindningen för att skapa en "negotiate"-funktion som är kompatibel med en SignalR-klient-SDK finns i Azure Functions-utveckling och konfiguration med Azure SignalR Service. Information om konfiguration och konfigurationsinformation finns i översikten.
Exempel
En C#-funktion kan skapas med något av följande C#-lägen:
- Isolerad arbetsmodell: Kompilerad C#-funktion som körs i en arbetsprocess som är isolerad från körningen. Isolerad arbetsprocess krävs för att stödja C#-funktioner som körs på LTS- och icke-LTS-versioner .NET och .NET Framework.
- Processmodell: Kompilerad C#-funktion som körs i samma process som Functions-körningen.
- C#-skript: Används främst när du skapar C#-funktioner i Azure Portal.
Viktigt!
Supporten upphör för den pågående modellen den 10 november 2026. Vi rekommenderar starkt att du migrerar dina appar till den isolerade arbetsmodellen för fullt stöd.
I följande exempel visas en C#-funktion som hämtar SignalR-anslutningsinformation med hjälp av indatabindningen och returnerar den via 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;
}
I följande exempel visas en SignalR-anslutningsinformationsindatabindning i en function.json-fil och en funktion som använder bindningen för att returnera anslutningsinformationen.
Här är bindningsdata för exemplet i filen function.json :
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
Här är JavaScript-koden:
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],
});
Slutför PowerShell-exempel väntar.
I följande exempel visas en SignalR-anslutningsinformationsindatabindning i en function.json-fil och en Python-funktion som använder bindningen för att returnera anslutningsinformationen.
Här är Python-koden:
def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
return func.HttpResponse(
connectionInfoJson,
status_code=200,
headers={
'Content-type': 'application/json'
}
)
I följande exempel visas en Java-funktion som hämtar SignalR-anslutningsinformation med hjälp av indatabindningen och returnerar den via 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;
}
Förbrukning
Autentiserade token
När en autentiserad klient utlöser funktionen kan du lägga till ett användar-ID-anspråk i den genererade token. Du kan enkelt lägga till autentisering i en funktionsapp med App Service-autentisering.
App Service-autentisering anger HTTP-huvuden med namnet x-ms-client-principal-id
och x-ms-client-principal-name
som innehåller den autentiserade användarens klienthuvudnamn respektive namn.
Du kan ange UserId
egenskapen för bindningen till värdet från antingen huvudet med hjälp av ett bindningsuttryck: {headers.x-ms-client-principal-id}
eller {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;
}
Här är bindningsdata i filen 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"
}
Här är JavaScript-koden:
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],
});
Slutför PowerShell-exempel väntar.
Här är Python-koden:
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;
}
Attribut
C#-bibliotek för både process- och isolerad arbetsprocess använder attribut för att definiera funktionen. C#-skriptet använder i stället en function.json konfigurationsfil.
I följande tabell förklaras egenskaperna för attributet SignalRConnectionInfoInput
:
Attributegenskap | beskrivning |
---|---|
HubName | Obligatoriskt. Hubbens namn. |
ConnectionStringSetting | Namnet på appinställningen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString . |
AnvändarID | Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
IdToken | Valfritt. En JWT-token vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med ClaimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
ClaimTypeList | Valfritt. En lista över anspråkstyper som filtrerar anspråken i IdToken . |
Kommentarer
I följande tabell förklaras de inställningar som stöds för anteckningen SignalRConnectionInfoInput
.
Inställning | Description |
---|---|
Namn | Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt. |
hubName | Obligatoriskt. Hubbens namn. |
connectionStringSetting | Namnet på appinställningen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString . |
userId | Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
idToken | Valfritt. En JWT-token vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
claimTypeList | Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken . |
Kommentarer
I följande tabell förklaras de inställningar som stöds för anteckningen SignalRConnectionInfoInput
.
Inställning | Description |
---|---|
Namn | Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt. |
hubName | Obligatoriskt. Hubbens namn. |
connectionStringSetting | Namnet på appinställningen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString . |
userId | Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
idToken | Valfritt. En JWT-token vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
claimTypeList | Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken . |
Konfiguration
I följande tabell förklaras de bindningskonfigurationsegenskaper som du anger i filen function.json .
function.json egenskap | beskrivning |
---|---|
typ | Måste anges till signalRConnectionInfo . |
riktning | Måste anges till in . |
hubName | Obligatoriskt. Hubbens namn. |
connectionStringSetting | Namnet på appinställningen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString . |
userId | Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
idToken | Valfritt. En JWT-token vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga. |
claimTypeList | Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken . |
Bindningsuttryck för HTTP-utlösare
Det är ett vanligt scenario att värdena för vissa attribut för SignalR-indatabindning kommer från HTTP-begäranden. Därför visar vi hur du binder värden från HTTP-begäranden till SignalR-indatabindningsattribut via bindningsuttryck.
HTTP-metadatatyp | Format för bindningsuttryck | beskrivning | Exempel |
---|---|---|---|
HTTP-begärandefråga | {query.QUERY_PARAMETER_NAME} |
Binder värdet för motsvarande frågeparameter till ett attribut | {query.userName} |
HTTP-begärandehuvud | {headers.HEADER_NAME} |
Binder värdet för en rubrik till ett attribut | {headers.token} |