C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

HTTP-клиент и внешние API

Разбирает HttpClient и внешние API как ненадёжную границу: время жизни обработчиков, маркеры отмены, повторы, идемпотентность, circuit breaker, потоковые ответы и безопасную диагностику. Ответ приходится выбирать с учётом протокола, а не только синтаксиса C#.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Почему создание HttpClient с собственным handler для каждого запроса опасно под нагрузкой?
C#
for (var i = 0; i < 10_000; i++)
{
    using var client = new HttpClient();
    await client.GetAsync(uri);
}
Вопрос 2 из 30
Что даёт IHttpClientFactory?
C#
services.AddHttpClient<CatalogClient>(client =>
{
    client.BaseAddress = new Uri("https://catalog.internal/");
});
Вопрос 3 из 30
Зачем освобождать HttpResponseMessage, особенно при ResponseHeadersRead?
C#
using var response = await client.SendAsync(request,
    HttpCompletionOption.ResponseHeadersRead, token);
response.EnsureSuccessStatusCode();
await using var body = await response.Content.ReadAsStreamAsync(token);
Вопрос 4 из 30
Что задаёт HttpClient.Timeout?
Вопрос 5 из 30
Какой абсолютный адрес получится из этого BaseAddress и относительного пути?
C#
client.BaseAddress = new Uri("https://api.example/x/");
await client.GetAsync("orders/1", token);
Вопрос 6 из 30
Где задавать Content-Type JSON?
C#
using var content = JsonContent.Create(command);
// content.Headers.ContentType == application/json
Вопрос 7 из 30
Что означает Accept: application/json?
C#
using var request = new HttpRequestMessage(HttpMethod.Get, "products/7");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Вопрос 8 из 30
Почему токен пользователя не стоит хранить в DefaultRequestHeaders singleton-клиента?
C#
using var request = new HttpRequestMessage(HttpMethod.Get, uri);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
Вопрос 9 из 30
Как передать correlation id?
Вопрос 10 из 30
Какую проблему предотвращает этот белый список заголовков?
C#
var safe = request.Headers
    .Where(h => AllowedHeaders.Contains(h.Key))
    .ToDictionary(h => h.Key, h => string.Join(',', h.Value));
Вопрос 11 из 30
Какой запрос обычно безопаснее повторить?
C#
using var response = await client.GetAsync("products/7", token);
// GET чтения обычно допускает повтор при временном транспортном сбое.
Вопрос 12 из 30
Стоит ли повторять 400 Bad Request?
Вопрос 13 из 30
Зачем exponential backoff с jitter?
C#
var delay = TimeSpan.FromMilliseconds(
    Math.Pow(2, attempt) * 100 + Random.Shared.Next(0, 100));
await Task.Delay(delay, token);
Вопрос 14 из 30
Когда учитывать Retry-After?
Вопрос 15 из 30
Как защитить повтор создания платежа?
C#
request.Headers.Add("Idempotency-Key", operationId.ToString());
Вопрос 16 из 30
Что делает circuit breaker?
C#
if (breaker.IsOpen)
    throw new BrokenCircuitException();
return await dependency.CallAsync(token);
Вопрос 17 из 30
Что такое bulkhead для HTTP-зависимости?
Вопрос 18 из 30
Почему ResponseHeadersRead полезен для большого тела?
C#
using var response = await client.SendAsync(request,
    HttpCompletionOption.ResponseHeadersRead, token);
await using var stream = await response.Content.ReadAsStreamAsync(token);
Вопрос 19 из 30
Почему fallback «вернуть пустой список» может быть опасен?
Вопрос 20 из 30
Как классифицировать 404 от каталога?
C#
if (response.StatusCode == HttpStatusCode.NotFound)
    return ProductResult.NotFound;
response.EnsureSuccessStatusCode();
Вопрос 21 из 30
Как unit-тестировать исходящий HttpClient?
C#
var handler = new RecordingHandler(_ =>
    new HttpResponseMessage(HttpStatusCode.OK)
    { Content = JsonContent.Create(new ProductDto(7)) });
var client = new HttpClient(handler) { BaseAddress = new Uri("https://test/") };
Вопрос 22 из 30
Что проверяет контрактный тест внешнего API?
Вопрос 23 из 30
Какие метрики нужны retry-политике?
Вопрос 24 из 30
Как связать исходящий вызов с распределённой трассой?
C#
using var activity = source.StartActivity("catalog.lookup", ActivityKind.Client);
activity?.SetTag("server.address", request.RequestUri?.Host);
activity?.SetTag("http.request.method", request.Method.Method);
Вопрос 25 из 30
Почему нельзя писать response body каждой ошибки целиком?
Вопрос 26 из 30
Что обычно сильнее влияет на задержку: LINQ над 20 элементами или 20 последовательных сетевых обменов HTTP?
Вопрос 27 из 30
Когда batching оправдан?
C#
var response = await client.PostAsJsonAsync(
    "products/batch", new BatchRequest(ids), token);
Вопрос 28 из 30
Почему BaseAddress/typed client лучше разбросанных абсолютных URL?
Вопрос 29 из 30
Когда кэш HTTP-ответа допустим?
C#
var key = $"product:{tenantId}:{id}:{locale}";
return await cache.GetOrCreateAsync(key, entry =>
{
    entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(2);
    return client.LoadAsync(id, locale, token);
});
Вопрос 30 из 30
Как оценивать HTTP/2 multiplexing?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу