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;
}
Ostrzeżenie
Dla uproszczenia pomijamy części uwierzytelniania i autoryzacji w tym przykładzie. W związku z tym ten punkt końcowy jest publicznie dostępny bez żadnych ograniczeń. Aby zapewnić bezpieczeństwo punktu końcowego negocjacji, należy zaimplementować odpowiednie mechanizmy uwierzytelniania i autoryzacji na podstawie określonych wymagań. Aby uzyskać wskazówki dotyczące ochrony punktów końcowych HTTP, zobacz następujące artykuły:
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} |