Azure Functions에 대한 SignalR Service 출력 바인딩
SignalR 출력 바인딩을 사용하여 Azure SignalR Service를 사용하여 하나 이상의 메시지를 보냅니다. 다음으로 메시지를 브로드캐스트할 수 있습니다.
- 연결된 모든 클라이언트
- 지정된 그룹의 커넥트 클라이언트
- 특정 사용자에게 인증된 연결된 클라이언트
출력 바인딩을 사용하면 그룹에 클라이언트 또는 사용자를 추가하고, 그룹에서 클라이언트 또는 사용자를 제거하는 등의 그룹을 관리할 수도 있습니다.
설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.
예시
모든 클라이언트에 브로드캐스트
C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.
- 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다.
- In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다.
- C# 스크립트: Azure Portal에서 C# 함수를 만들 때 주로 사용됩니다.
다음 예제에서는 출력 바인딩을 사용하여 연결된 모든 클라이언트에 메시지를 보내는 함수를 보여 줍니다. newMessage는 각 클라이언트에서 호출할 메서드의 이름입니다.
[Function(nameof(BroadcastToAll))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction BroadcastToAll([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
using var bodyReader = new StreamReader(req.Body);
return new SignalRMessageAction("newMessage")
{
// broadcast to all the connected clients without specifying any connection, user or group.
Arguments = new[] { bodyReader.ReadToEnd() },
};
}
function.json 파일의 바인딩 데이터는 다음과 같습니다.
예제 function.json:
{
"type": "signalR",
"name": "signalROutput",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "out"
}
const { app, output } = require('@azure/functions');
const signalR = output.generic({
type: 'signalR',
name: 'signalR',
hubName: 'hub',
connectionStringSetting: 'AzureSignalRConnectionString',
});
// You can use any other trigger type instead.
app.http('broadcast', {
methods: ['GET'],
authLevel: 'anonymous',
extraOutputs: [signalR],
handler: (request, context) => {
context.extraOutputs.set(signalR, {
"target": "newMessage",
"arguments": [request.body]
});
}
});
완전한 PowerShell 예제가 보류 중입니다.
Python 코드는 다음과 같습니다.
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
message = req.get_json()
signalROutput.set(json.dumps({
'target': 'newMessage',
'arguments': [ message ]
}))
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {
SignalRMessage message = new SignalRMessage();
message.target = "newMessage";
message.arguments.add(req.getBody());
return message;
}
사용자에게 보내기
SignalR 메시지에서 ‘user ID’ 속성을 설정하여 사용자에게 인증된 연결에만 메시지를 보낼 수 있습니다.
[Function(nameof(SendToUser))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction SendToUser([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
using var bodyReader = new StreamReader(req.Body);
return new SignalRMessageAction("newMessage")
{
Arguments = new[] { bodyReader.ReadToEnd() },
UserId = "userToSend",
};
}
function.json 파일의 바인딩 데이터는 다음과 같습니다.
예제 function.json:
{
"type": "signalR",
"name": "signalROutput",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "out"
}
완전한 PowerShell 예제가 보류 중입니다.
Python 코드는 다음과 같습니다.
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
message = req.get_json()
signalROutput.set(json.dumps({
#message will only be sent to this user ID
'userId': 'userId1',
'target': 'newMessage',
'arguments': [ message ]
}))
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {
SignalRMessage message = new SignalRMessage();
message.userId = "userId1";
message.target = "newMessage";
message.arguments.add(req.getBody());
return message;
}
const { app, output } = require('@azure/functions');
const signalR = output.generic({
type: 'signalR',
name: 'signalR',
hubName: 'hub',
connectionStringSetting: 'AzureSignalRConnectionString',
});
app.http('sendToUser', {
methods: ['GET'],
authLevel: 'anonymous',
extraOutputs: [signalR],
handler: (request, context) => {
context.extraOutputs.set(signalR, {
"target": "newMessage",
"arguments": [request.body],
"userId": "userId1",
});
}
});
그룹으로 보내기
SignalR 메시지에서 그룹 이름 설정하여 그룹에 추가된 연결에만 메시지를 보낼 수 있습니다.
[Function(nameof(SendToGroup))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRMessageAction SendToGroup([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
using var bodyReader = new StreamReader(req.Body);
return new SignalRMessageAction("newMessage")
{
Arguments = new[] { bodyReader.ReadToEnd() },
GroupName = "groupToSend"
};
}
function.json 파일의 바인딩 데이터는 다음과 같습니다.
예제 function.json:
{
"type": "signalR",
"name": "signalROutput",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "out"
}
const { app, output } = require('@azure/functions');
const signalR = output.generic({
type: 'signalR',
name: 'signalR',
hubName: 'hub',
connectionStringSetting: 'AzureSignalRConnectionString',
});
app.http('sendToGroup', {
methods: ['GET'],
authLevel: 'anonymous',
extraOutputs: [signalR],
handler: (request, context) => {
context.extraOutputs.set(signalR, {
"target": "newMessage",
"arguments": [request.body],
"groupName": "myGroup",
});
}
});
완전한 PowerShell 예제가 보류 중입니다.
Python 코드는 다음과 같습니다.
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
message = req.get_json()
signalROutput.set(json.dumps({
#message will only be sent to this group
'groupName': 'myGroup',
'target': 'newMessage',
'arguments': [ message ]
}))
@FunctionName("sendMessage")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRMessage sendMessage(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {
SignalRMessage message = new SignalRMessage();
message.groupName = "myGroup";
message.target = "newMessage";
message.arguments.add(req.getBody());
return message;
}
그룹 관리
SignalR Service를 사용하면 사용자 또는 연결을 그룹에 추가할 수 있습니다. 그런 다음, 메시지를 그룹으로 보낼 수 있습니다. SignalR
출력 바인딩을 사용하여 그룹을 관리할 수 있습니다.
멤버를 추가하거나 제거하려면 SignalRGroupActionType
을 지정합니다. 다음 예제에서는 그룹에서 사용자를 제거합니다.
[Function(nameof(RemoveFromGroup))]
[SignalROutput(HubName = "chat", ConnectionStringSetting = "SignalRConnection")]
public static SignalRGroupAction RemoveFromGroup([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
return new SignalRGroupAction(SignalRGroupActionType.Remove)
{
GroupName = "group1",
UserId = "user1"
};
}
참고 항목
올바르게 바인딩하려면 ClaimsPrincipal
Azure Functions에서 인증 설정을 구성해야 합니다.
function.json 파일의 바인딩 데이터는 다음과 같습니다.
예제 function.json:
{
"type": "signalR",
"name": "signalROutput",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "out"
}
const { app, output } = require('@azure/functions');
const signalR = output.generic({
type: 'signalR',
name: 'signalR',
hubName: 'hub',
connectionStringSetting: 'AzureSignalRConnectionString',
});
// The following function adds a user to a group
app.http('addUserToGroup', {
methods: ['POST'],
authLevel: 'anonymous',
extraOutputs: [signalR],
handler: (request, context) => {
context.extraOutputs.set(signalR, {
"userId": req.query.userId,
"groupName": "myGroup",
"action": "add"
});
}
});
// The following function removes a user from a group
app.http('removeUserFromGroup', {
methods: ['POST'],
authLevel: 'anonymous',
extraOutputs: [signalR],
handler: (request, context) => {
context.extraOutputs.set(signalR, {
"userId": req.query.userId,
"groupName": "myGroup",
"action": "remove"
});
}
});
완전한 PowerShell 예제가 보류 중입니다.
다음 예제에서는 그룹에 사용자를 추가합니다.
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
signalROutput.set(json.dumps({
'userId': 'userId1',
'groupName': 'myGroup',
'action': 'add'
}))
다음 예제에서는 그룹에서 사용자를 제거합니다.
def main(req: func.HttpRequest, signalROutput: func.Out[str]) -> func.HttpResponse:
signalROutput.set(json.dumps({
'userId': 'userId1',
'groupName': 'myGroup',
'action': 'remove'
}))
다음 예제에서는 그룹에 사용자를 추가합니다.
@FunctionName("addToGroup")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRGroupAction addToGroup(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
@BindingName("userId") String userId) {
SignalRGroupAction groupAction = new SignalRGroupAction();
groupAction.action = "add";
groupAction.userId = userId;
groupAction.groupName = "myGroup";
return action;
}
다음 예제에서는 그룹에서 사용자를 제거합니다.
@FunctionName("removeFromGroup")
@SignalROutput(name = "$return", HubName = "hubName1")
public SignalRGroupAction removeFromGroup(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
@BindingName("userId") String userId) {
SignalRGroupAction groupAction = new SignalRGroupAction();
groupAction.action = "remove";
groupAction.userId = userId;
groupAction.groupName = "myGroup";
return action;
}
특성
In Process 및 격리된 작업자 프로세스 C# 라이브러리는 모두 특성을 사용하여 함수를 정의합니다. C# 스크립트는 대신 function.json 구성 파일을 사용합니다.
다음 표에서는 SignalROutput
특성의 속성을 설명합니다.
특성 속성 | 설명 |
---|---|
HubName | 이 값은 연결 정보가 생성되는 SignalR Hub의 이름으로 설정해야 합니다. |
ConnectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
주석
다음 표에서는 SignalROutput
주석에 대해 지원되는 설정을 설명합니다.
설정 | Description |
---|---|
이름 | 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다. |
hubName | 이 값은 연결 정보가 생성되는 SignalR Hub의 이름으로 설정해야 합니다. |
connectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
구성
다음 표에서는 function.json 파일에 설정된 바인딩 구성 속성을 설명합니다.
function.json 속성 | 설명 |
---|---|
type | signalR 로 설정해야 합니다. |
direction | out 로 설정해야 합니다. |
이름 | 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다. |
hubName | 이 값은 연결 정보가 생성되는 SignalR Hub의 이름으로 설정해야 합니다. |
connectionStringSetting | SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString )입니다. |
로컬에서 개발하는 경우 Values
컬렉션의 local.settings.json 파일에 애플리케이션 설정을 추가합니다.