Какие способы клиент-серверного взаимодействия в C# ты знаешь?

Ответ

Выбор технологии зависит от требований к производительности, латентности, контракту API и поддержке реального времени.

Способ Протокол Ключевые характеристики Типичный сценарий использования
HTTP/REST (ASP.NET Core WebAPI) HTTP/1.1, HTTP/2, HTTPS Стандартный, кэшируемый, stateless, широкий инструментарий. CRUD-операции, мобильные и веб-бэкенды, публичные API.
gRPC HTTP/2 Высокая производительность, строгий контракт (.proto), потоковая передача, бинарный формат (Protobuf). Микросервисы, внутренние сервисы, сценарии с низкой задержкой.
SignalR WebSockets (основной), Long Polling (фолбэк) Двунаправленная связь в реальном времени, абстракция над транспортом, управление соединениями (хабы). Чат, уведомления, дашборды, collaborative apps.
Raw WebSockets WebSockets (ws://, wss://) Полный низкоуровневый контроль над фреймами и соединением. Кастомные протоколы поверх WS, игры, бинарные потоки.
WCF Net.TCP, HTTP, MSMQ и др. Устаревшая, комплексная платформа для распределённых систем. Требует .NET Framework. Легационные enterprise-системы.

Примеры инициализации:

1. REST-клиент с HttpClient:

// Используйте IHttpClientFactory для правильного управления жизненным циклом!
public class DataService
{
    private readonly HttpClient _httpClient;
    public DataService(HttpClient httpClient) => _httpClient = httpClient;

    public async Task<Data> GetDataAsync()
    {
        var response = await _httpClient.GetFromJsonAsync<Data>("/api/data");
        return response;
    }
}

2. Сервер gRPC:

// service.proto
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
// Startup.cs
app.MapGrpcService<GreeterService>();

3. SignalR Hub:

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        // Отправка сообщения всем подключённым клиентам
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

Рекомендация: Для новых проектов используйте ASP.NET Core WebAPI (REST) для стандартных запросов и gRPC для внутренней межсервисной коммуникации. SignalR — лучший выбор для real-time функциональности.

Ответ 18+ 🔞

Давай разберёмся, какую хуйню выбрать для общения между сервисами, а то тут вариантов — как говна за баней. Всё зависит от того, что тебе надо: скорость, латентность, контракт API или поддержка реального времени.

Способ Протокол Ключевые характеристики Где обычно втыкают
HTTP/REST (ASP.NET Core WebAPI) HTTP/1.1, HTTP/2, HTTPS Стандартная тема, кэшируется, без состояния, инструментов — дохуя. CRUD-операции, бэкенды для мобилок и веба, публичные API.
gRPC HTTP/2 Высокая производительность, строгий контракт (.proto), потоковая передача, бинарный формат (Protobuf). Микросервисы, внутренние сервисы, когда задержка должна быть минимальной.
SignalR WebSockets (основной), Long Polling (фолбэк) Двусторонняя связь в реальном времени, абстракция над транспортом, управление соединениями (хабы). Чаты, уведомления, дашборды, приложения для совместной работы.
Raw WebSockets WebSockets (ws://, wss://) Полный низкоуровневый контроль над фреймами и соединением. Кастомные протоколы поверх WS, игры, бинарные потоки.
WCF Net.TCP, HTTP, MSMQ и др. Устаревшая, сложная платформа для распределённых систем. Требует .NET Framework. Легационные enterprise-системы, от которых все уже давно охренели.

Как это всё выглядит в коде, ёпта:

1. REST-клиент с HttpClient:

// Используй IHttpClientFactory, чтобы не выстрелить себе в ногу с жизненным циклом!
public class DataService
{
    private readonly HttpClient _httpClient;
    public DataService(HttpClient httpClient) => _httpClient = httpClient;

    public async Task<Data> GetDataAsync()
    {
        var response = await _httpClient.GetFromJsonAsync<Data>("/api/data");
        return response;
    }
}

2. Сервер gRPC:

// service.proto
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
// Startup.cs
app.MapGrpcService<GreeterService>();

3. SignalR Hub:

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        // Отправка сообщения всем подключённым клиентам
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

Итог, блядь: Для новых проектов бери ASP.NET Core WebAPI (REST) для обычных запросов и gRPC для внутренней коммуникации между сервисами. А если нужен real-time — то SignalR тебе в руки, лучшего варианта просто нет.