Azure Functions에 대한 SignalR Service 입력 바인딩
클라이언트가 Azure SignalR Service에 연결하려면 먼저 서비스 엔드포인트 URL 및 유효한 액세스 토큰을 검색해야 합니다. SignalR커넥트ionInfo 입력 바인딩은 SignalR Service 엔드포인트 URL 및 서비스에 연결하는 데 사용되는 유효한 토큰을 생성합니다. 토큰은 시간이 제한되어 있으며 특정 사용자를 연결에 인증하는 데 사용할 수 있습니다. 따라서 토큰을 캐시하거나 클라이언트 간에 공유해서는 안 됩니다. 일반적으로 클라이언트가 연결 정보를 검색할 수 있도록 HTTP 트리거와 함께 SignalRConnectionInfo를 사용합니다.
이 바인딩을 사용하여 SignalR 클라이언트 SDK와 호환되는 "협상" 함수를 만드는 방법에 대한 자세한 내용은 Azure SignalR Service를 사용한 Azure Functions 개발 및 구성을 참조하세요. 설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.
예시
C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.
- 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다.
- In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다.
- C# 스크립트: Azure Portal에서 C# 함수를 만들 때 주로 사용됩니다.
Important
2026년 11월 10일에 In-process 모델에 대한 지원이 종료됩니다. 모든 지원을 위해 앱을 격리된 작업자 모델로 마이그레이션하는 것이 좋습니다.
다음 예제에서는 입력 바인딩을 사용하여 SignalR 연결 정보를 획득하고 HTTP를 통해 해당 정보를 반환하는 C# 함수를 보여줍니다.
[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;
}
다음 예제에서는 function.json 파일의 SignalR 연결 정보 입력 바인딩 및 바인딩을 사용하여 연결 정보를 반환하는 함수를 보여줍니다.
다음은 function.json 파일의 예에 대한 바인딩 데이터입니다.
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
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],
});
완전한 PowerShell 예제가 보류 중입니다.
다음 예제에서는 function.json 파일의 SignalR 연결 정보 입력 바인딩과 바인딩을 사용하여 연결 정보를 반환하는 Python 함수를 보여 줍니다.
Python 코드는 다음과 같습니다.
def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
return func.HttpResponse(
connectionInfoJson,
status_code=200,
headers={
'Content-type': 'application/json'
}
)
다음 예시에서는 입력 바인딩을 사용하여 SignalR 연결 정보를 획득하고 HTTP를 통해 해당 정보를 반환하는 Java 함수를 보여줍니다.
@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;
}
사용
인증된 토큰
인증된 클라이언트에서 함수를 트리거하면 생성된 토큰에 사용자 ID 클레임을 추가할 수 있습니다. App Service 인증을 사용하여 함수 앱에 인증을 쉽게 추가할 수 있습니다.
App Service 인증은 x-ms-client-principal-id
라는 HTTP 헤더 및 인증된 사용자의 클라이언트 보안 주체 ID 및 이름 각각을 포함하는 x-ms-client-principal-name
을 설정합니다.
바인딩 식을 사용하여 바인딩의 UserId
속성을 {headers.x-ms-client-principal-id}
또는 {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;
}
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"
}
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],
});
완전한 PowerShell 예제가 보류 중입니다.
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;
}
특성
In Process 및 격리된 작업자 프로세스 C# 라이브러리는 모두 특성을 사용하여 함수를 정의합니다. C# 스크립트는 대신 function.json 구성 파일을 사용합니다.
다음 표에서는 SignalRConnectionInfoInput
특성의 속성을 설명합니다.
특성 속성 | 설명 |
---|---|
HubName | 필수입니다. 허브 이름입니다. |
ConnectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
UserId | 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
IdToken | 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. ClaimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
ClaimTypeList | 선택 사항. IdToken에서 클레임을 필터링하는 클레임 유형 목록입니다. |
주석
다음 표에서는 SignalRConnectionInfoInput
주석에 대해 지원되는 설정을 설명합니다.
설정 | Description |
---|---|
이름 | 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다. |
hubName | 필수입니다. 허브 이름입니다. |
connectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
userId | 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
idToken | 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
claimTypeList | 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다. |
주석
다음 표에서는 SignalRConnectionInfoInput
주석에 대해 지원되는 설정을 설명합니다.
설정 | Description |
---|---|
이름 | 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다. |
hubName | 필수입니다. 허브 이름입니다. |
connectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
userId | 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
idToken | 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
claimTypeList | 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다. |
구성
다음 표에서는 function.json 파일에 설정된 바인딩 구성 속성을 설명합니다.
function.json 속성 | 설명 |
---|---|
type | signalRConnectionInfo 로 설정해야 합니다. |
direction | in 로 설정해야 합니다. |
hubName | 필수입니다. 허브 이름입니다. |
connectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
userId | 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
idToken | 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다. |
claimTypeList | 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다. |
HTTP 트리거에 대한 바인딩 식
SignalR 입력 바인딩의 일부 특성 값은 HTTP 요청에서 오는 것이 일반적인 시나리오입니다. 따라서 바인딩 식을 통해 HTTP 요청의 값을 SignalR 입력 바인딩 특성에 바인딩하는 방법을 보여 줍니다.
HTTP 메타데이터 형식 | 바인딩 식 형식 | 설명 | 예시 |
---|---|---|---|
HTTP 요청 쿼리 | {query.QUERY_PARAMETER_NAME} |
해당 쿼리 매개 변수의 값을 특성에 바인딩합니다. | {query.userName} |
HTTP 요청 헤더 | {headers.HEADER_NAME} |
헤더 값을 특성에 바인딩합니다. | {headers.token} |