Есть ли у вас опыт работы с сетевым взаимодействием в .NET?

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

Ответ

Да, есть практический опыт реализации и потребления различных сетевых протоколов и технологий в .NET.

1. HTTP/REST API (HttpClient): Стандарт для веб-сервисов. Важно использовать IHttpClientFactory для управления временем жизни и устойчивости соединений.

// Регистрация в DI контейнере (Startup/Program.cs)
services.AddHttpClient("ExternalAPI", client =>
{
    client.BaseAddress = new Uri("https://api.example.com/");
    client.DefaultRequestHeaders.Add("User-Agent", "MyApp");
});

// Использование в сервисе
public class DataService
{
    private readonly IHttpClientFactory _httpClientFactory;
    public DataService(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory;

    public async Task<Data> FetchDataAsync()
    {
        var client = _httpClientFactory.CreateClient("ExternalAPI");
        var response = await client.GetAsync("/data");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadFromJsonAsync<Data>();
    }
}

2. WebSockets (ClientWebSocket): Для двусторонней связи в реальном времени.

using var websocket = new ClientWebSocket();
await websocket.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None);

// Отправка сообщения
var bufferSend = Encoding.UTF8.GetBytes("Hello, WebSocket!");
await websocket.SendAsync(new ArraySegment<byte>(bufferSend), WebSocketMessageType.Text, true, CancellationToken.None);

// Получение ответа
var bufferReceive = new byte[1024];
var result = await websocket.ReceiveAsync(new ArraySegment<byte>(bufferReceive), CancellationToken.None);
var message = Encoding.UTF8.GetString(bufferReceive, 0, result.Count);
Console.WriteLine($"Received: {message}");

3. Другие технологии:

  • gRPC: Для высокопроизводительного RPC с использованием HTTP/2 и Protocol Buffers. Отлично подходит для внутренней микросервисной коммуникации.
  • SignalR: Библиотека от Microsoft для добавления веб-функциональности реального времени (использует WebSockets, Server-Sent Events, Long Polling как fallback).
  • Raw TCP/UDP с System.Net.Sockets.Socket: Для специфических низкоуровневых протоколов или высокой производительности.
  • Очереди сообщений: Интеграция с RabbitMQ (через библиотеку RabbitMQ.Client) или Apache Kafka для асинхронной, отказоустойчивой коммуникации между сервисами.