SignalR — мощный инструмент для организации двусторонней связи в ASP.NET Core, но в некоторых случаях могут потребоваться альтернативные решения. Рассмотрим основные варианты, доступные в C#.
WebSockets
WebSockets предоставляют низкоуровневое API для двустороннего общения между клиентом и сервером. В ASP.NET Core они поддерживаются на уровне middleware.
Пример использования WebSocket в ASP.NET Core
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWebSockets();
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws" && context.WebSockets.IsWebSocketRequest)
{
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await HandleWebSocketAsync(webSocket);
}
else
{
await next();
}
});
app.Run();
gRPC
gRPC — это высокопроизводительный фреймворк для удаленного вызова процедур (RPC), поддерживающий двустороннюю потоковую передачу данных.
Пример реализации gRPC-сервера в C#
public class ChatService : Chat.ChatBase
{
public override async Task ChatStream(IAsyncStreamReader<ChatMessage> requestStream, IServerStreamWriter<ChatMessage> responseStream, ServerCallContext context)
{
await foreach (var message in requestStream.ReadAllAsync())
{
await responseStream.WriteAsync(new ChatMessage { Content = $"Ответ: {message.Content}" });
}
}
}
MQTT
Протокол MQTT широко используется в IoT-приложениях, но также подходит для реализации обмена сообщениями в реальном времени.
Пример клиента MQTT на C#
var mqttFactory = new MqttFactory();
var client = mqttFactory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("broker.hivemq.com")
.Build();
await client.ConnectAsync(options);
await client.SubscribeAsync("test/topic");
Redis Pub/Sub
Redis Pub/Sub позволяет реализовать обмен сообщениями через брокер Redis.
Пример подписки на канал Redis
var subscriber = ConnectionMultiplexer.Connect("localhost").GetSubscriber();
await subscriber.SubscribeAsync("messages", (channel, message) =>
{
Console.WriteLine($"Получено сообщение: {message}");
});
Apache Kafka
Kafka — распределенная система обмена сообщениями, подходящая для высоконагруженных приложений.
Пример отправки сообщения в Kafka
var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
using var producer = new ProducerBuilder<Null, string>(config).Build();
await producer.ProduceAsync("test-topic", new Message<Null, string> { Value = "Привет, Kafka!" });