Отправка сообщений в бессерверную службу Azure SignalR.C#

Место общения программистов C#
Ответить
Anonymous
 Отправка сообщений в бессерверную службу Azure SignalR.

Сообщение Anonymous »

Моя цель — облегчить RPC между клиентами, где клиент может быть и сервером, и клиентом.
Я решил использовать бессерверную службу Azure SignalR с функцией Azure для привязка триггера.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу вызвать эти методы из клиента. Трансляция триггера SignalR не вызывается.
Мой вопрос: если я правильно подхожу к проблеме, я хочу отправлять сообщения в службу SignalR, из которой функция Azure реагирует на подключенных прослушивателей, но при прямом подключении к службе я получаю 403, несмотря ни на что (у меня не включена управляемая идентификация), нужно ли мне передавать это через функцию?
Я создал бессерверную систему Служба Azure SignalR и Azure Функция.
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.Functions.Worker.SignalRService;
using Microsoft.Extensions.Logging;

namespace DotnetIsolated_ClassBased
{
[SignalRConnection("AzureSignalRConnectionString")]
public class Functions : ServerlessHub
{
private const string HubName = ""
private readonly ILogger _logger;

public Functions(IServiceProvider serviceProvider, ILogger logger) : base(serviceProvider)
{
_logger = logger;
}

[Function(nameof(BroadcastToAll))]
[SignalROutput(HubName = HubName, 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("negotiate")]
public async Task Negotiate([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
_logger.LogInformation($"Negotiating with user: {req.Headers.GetValues("userId").FirstOrDefault()}");

var negotiateResponse = await NegotiateAsync(new() { UserId = req.Headers.GetValues("userId").FirstOrDefault() });
var response = req.CreateResponse();
await response.WriteBytesAsync(negotiateResponse.ToArray());
return response;
}

[Function("OnConnected")]
public Task OnConnected([SignalRTrigger(HubName, "connections", "connected")] SignalRInvocationContext invocationContext)
{
invocationContext.Headers.TryGetValue("Authorization", out var auth);
_logger.LogInformation($"{invocationContext.ConnectionId} has connected");
return Clients.All.newConnection(new NewConnection(invocationContext.ConnectionId, auth));
}

[Function("Broadcast")]
public Task Broadcast(
[SignalRTrigger(HubName, "messages", "broadcast", "message")] SignalRInvocationContext invocationContext, string message)
{
_logger.LogInformation($"Broadcasting message: {message}");
return Clients.All.newMessage(new NewMessage(invocationContext, message));
}

[Function("SendToGroup")]
public Task SendToGroup([SignalRTrigger(HubName, "messages", "SendToGroup", "groupName", "message")] SignalRInvocationContext invocationContext, string groupName, string message)
{
return Clients.Group(groupName).newMessage(new NewMessage(invocationContext, message));
}

[Function("SendToUser")]
public Task SendToUser([SignalRTrigger(HubName, "messages", "SendToUser", "userName", "message")] SignalRInvocationContext invocationContext, string userName, string message)
{
return Clients.User(userName).newMessage(new NewMessage(invocationContext, message));
}

[Function("SendToConnection")]
public Task SendToConnection([SignalRTrigger(HubName, "messages", "SendToConnection", "connectionId", "message")] SignalRInvocationContext invocationContext, string connectionId, string message)
{
return Clients.Client(connectionId).newMessage(new NewMessage(invocationContext, message));
}

[Function("JoinGroup")]
public Task JoinGroup([SignalRTrigger(HubName, "messages", "JoinGroup", "connectionId", "groupName")] SignalRInvocationContext invocationContext, string connectionId, string groupName)
{
return Groups.AddToGroupAsync(connectionId, groupName);
}

[Function("LeaveGroup")]
public Task LeaveGroup([SignalRTrigger(HubName, "messages", "LeaveGroup", "connectionId", "groupName")] SignalRInvocationContext invocationContext, string connectionId, string groupName)
{
return Groups.RemoveFromGroupAsync(connectionId, groupName);
}

[Function("JoinUserToGroup")]
public Task JoinUserToGroup([SignalRTrigger(HubName, "messages", "JoinUserToGroup", "userName", "groupName")] SignalRInvocationContext invocationContext, string userName, string groupName)
{
return UserGroups.AddToGroupAsync(userName, groupName);
}

[Function("LeaveUserFromGroup")]
public Task LeaveUserFromGroup([SignalRTrigger(HubName, "messages", "LeaveUserFromGroup", "userName", "groupName")] SignalRInvocationContext invocationContext, string userName, string groupName)
{
return UserGroups.RemoveFromGroupAsync(userName, groupName);
}

[Function("OnDisconnected")]
public void OnDisconnected([SignalRTrigger(HubName, "connections", "disconnected")] SignalRInvocationContext invocationContext)
{
_logger.LogInformation($"{invocationContext.ConnectionId} has disconnected");
}
}
public class NewConnection
{
public string ConnectionId { get; }

public string Authentication { get; }

public NewConnection(string connectionId, string auth)
{
ConnectionId = connectionId;
Authentication = auth;
}
}

public class NewMessage
{
public string ConnectionId { get; }
public string Sender { get; }
public string Text { get; }

public NewMessage(SignalRInvocationContext invocationContext, string message)
{
Sender = string.IsNullOrEmpty(invocationContext.UserId) ? string.Empty : invocationContext.UserId;
ConnectionId = invocationContext.ConnectionId;
Text = message;
}
}

public interface IChatClient
{
Task newMessage(NewMessage message);
Task newConnection(NewConnection connection);
}

// both clients look like this
var connection = new HubConnectionBuilder()
.WithUrl("/api", (options) =>
{
options.Headers.Add("UserId", "");
options.AccessTokenProvider = async () =>
{
return await Task.FromResult(""); // ikn about hardcoing tokens, this is just for the poc
};
})
.Build();

connection.On("Broadcast", Console.WriteLine);
await connection.StartAsync();
await connection.SendAsync("Broadcast", "This is a broadcast");


Подробнее здесь: https://stackoverflow.com/questions/792 ... lr-service
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»