Какие библиотеки вы использовали для межсетевого взаимодействия?

«Какие библиотеки вы использовали для межсетевого взаимодействия?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для реализации сетевой коммуникации в .NET применял следующие технологии и библиотеки, каждая для своих сценариев:

1. HTTP/REST API:

  • HttpClient (из System.Net.Http): Основной класс для выполнения HTTP-запросов. Важно использовать его правильно (через IHttpClientFactory для избежания проблем с сокетами).
    // Использование с IHttpClientFactory (рекомендуется в ASP.NET Core)
    public class MyService
    {
        private readonly HttpClient _client;
        public MyService(IHttpClientFactory clientFactory)
        {
            _client = clientFactory.CreateClient();
            _client.BaseAddress = new Uri("https://api.example.com");
        }
        public async Task<string> GetDataAsync()
        {
            return await _client.GetStringAsync("/data");
        }
    }
  • Refit/RestSharp: Библиотеки-обёртки над HttpClient, которые упрощают работу с REST API через декларативные интерфейсы.

2. Real-time коммуникация:

  • SignalR: Идеален для двусторонней связи в реальном времени (чаты, дашборды, уведомления). Абстрагируется над транспортами (WebSockets, Server-Sent Events, Long Polling).
    // Клиент (JavaScript/TypeScript)
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/chatHub")
        .build();
    connection.on("ReceiveMessage", (user, message) => { /*...*/ });

3. Высокопроизводительный RPC (Remote Procedure Call):

  • gRPC: Использую для внутренней микросервисной коммуникации, где важны производительность (бинарный протокол Protobuf) и строгие контракты (.proto файлы).
    // Клиентский код
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });

4. Низкоуровневая работа с сокетами:

  • System.Net.Sockets (TcpClient, TcpListener, Socket): Для реализации кастомных бинарных протоколов или когда нужен полный контроль над сетевым взаимодействием.

5. Для сериализации/десериализации данных:

  • System.Text.Json (предпочтительно в .NET Core 3.1+): Высокая производительность, встроена в runtime.
  • Newtonsoft.Json (Json.NET): Более гибкая и функциональная, часто используется в legacy-проектах.

Выбор технологии определяется требованиями: HTTP/REST для публичных API, gRPC для внутренних сервисов, SignalR для real-time, сырые сокеты для специфичных протоколов.