C# 1001 notes
前往频道在 Telegram
Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp
显示更多6 688
订阅者
-224 小时
+147 天
+4030 天
正在加载数据
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
十月 '2610月 '26
十月 '26
+82
在2个频道中
九月 '26
+107
在9个频道中
Get PRO
八月 '26
+132
在37个频道中
Get PRO
七月 '26
+102
在41个频道中
Get PRO
六月 '26
+73
在0个频道中
Get PRO
五月 '26
+67
在0个频道中
Get PRO
四月 '26
+66
在0个频道中
Get PRO
三月 '26
+57
在0个频道中
Get PRO
二月 '26
+138
在0个频道中
Get PRO
一月 '26
+91
在1个频道中
Get PRO
十二月 '25
+85
在0个频道中
Get PRO
十一月 '25
+132
在3个频道中
Get PRO
十月 '25
+87
在1个频道中
Get PRO
九月 '25
+101
在4个频道中
Get PRO
八月 '25
+81
在0个频道中
Get PRO
七月 '25
+80
在0个频道中
Get PRO
六月 '25
+83
在0个频道中
Get PRO
五月 '25
+60
在0个频道中
Get PRO
四月 '25
+80
在0个频道中
Get PRO
三月 '25
+107
在0个频道中
Get PRO
二月 '25
+105
在0个频道中
Get PRO
一月 '25
+169
在0个频道中
Get PRO
十二月 '24
+202
在1个频道中
Get PRO
十一月 '24
+203
在2个频道中
Get PRO
十月 '24
+364
在1个频道中
Get PRO
九月 '24
+241
在0个频道中
Get PRO
八月 '24
+262
在1个频道中
Get PRO
七月 '24
+168
在0个频道中
Get PRO
六月 '24
+398
在2个频道中
Get PRO
五月 '24
+379
在35个频道中
Get PRO
四月 '24
+304
在43个频道中
Get PRO
三月 '24
+314
在20个频道中
Get PRO
二月 '24
+281
在1个频道中
Get PRO
一月 '24
+572
在45个频道中
Get PRO
十二月 '23
+941
在48个频道中
Get PRO
十一月 '23
+655
在2个频道中
Get PRO
十月 '23
+61
在0个频道中
Get PRO
九月 '23
+80
在0个频道中
Get PRO
八月 '23
+507
在0个频道中
Get PRO
七月 '23
+487
在0个频道中
Get PRO
六月 '23
+88
在0个频道中
Get PRO
五月 '23
+569
在0个频道中
Get PRO
四月 '23
+21
在0个频道中
Get PRO
三月 '23
+28
在0个频道中
Get PRO
二月 '23
+23
在0个频道中
Get PRO
一月 '23
+28
在0个频道中
Get PRO
十二月 '22
+32
在0个频道中
Get PRO
十一月 '22
+31
在0个频道中
Get PRO
十月 '22
+40
在0个频道中
Get PRO
九月 '22
+28
在0个频道中
Get PRO
八月 '22
+43
在0个频道中
Get PRO
七月 '22
+321
在0个频道中
Get PRO
六月 '22
+41
在0个频道中
Get PRO
五月 '22
+37
在0个频道中
Get PRO
四月 '22
+180
在0个频道中
Get PRO
三月 '220
在0个频道中
Get PRO
二月 '220
在0个频道中
Get PRO
一月 '220
在0个频道中
Get PRO
十二月 '210
在0个频道中
Get PRO
十一月 '210
在0个频道中
Get PRO
十月 '210
在0个频道中
Get PRO
九月 '210
在0个频道中
Get PRO
八月 '210
在0个频道中
Get PRO
七月 '210
在0个频道中
Get PRO
六月 '210
在0个频道中
Get PRO
五月 '210
在0个频道中
Get PRO
四月 '21
+1
在0个频道中
Get PRO
三月 '21
+45
在0个频道中
Get PRO
二月 '21
+54
在0个频道中
Get PRO
一月 '21
+42
在0个频道中
Get PRO
十二月 '20
+1 304
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 26 十月 | +1 | |||
| 25 十月 | 0 | |||
| 24 十月 | +1 | |||
| 23 十月 | +3 | |||
| 22 十月 | +3 | |||
| 21 十月 | +4 | |||
| 20 十月 | +6 | |||
| 19 十月 | +5 | |||
| 18 十月 | +19 | |||
| 17 十月 | +1 | |||
| 16 十月 | +3 | |||
| 15 十月 | +3 | |||
| 14 十月 | +3 | |||
| 13 十月 | +4 | |||
| 12 十月 | +3 | |||
| 11 十月 | +4 | |||
| 10 十月 | +2 | |||
| 09 十月 | +2 | |||
| 08 十月 | +1 | |||
| 07 十月 | +1 | |||
| 06 十月 | +3 | |||
| 05 十月 | +1 | |||
| 04 十月 | +1 | |||
| 03 十月 | +1 | |||
| 02 十月 | +4 | |||
| 01 十月 | +3 |
频道帖子
В C# наконец появились union-типы
Разбираем C# 15 и .NET 11: union-типы, закрытые иерархии через closed, аргументы в коллекционных выражениях, extension-индексаторы и именованные break и continue.
Разработчики на C# просили размеченные объединения (discriminated unions) почти десять лет. Обсуждение в репозитории языка годами оставалось одним из самых популярных, а команды тем временем писали свои OneOf, Result и иерархии из абстрактных record с бесконечными default: throw. В C# 15, который выходит вместе с .NET 11, союзы наконец становятся частью языка. Вместе с ними приходят закрытые иерархии, аргументы в коллекционных выражениях, extension-индексаторы и именованные break/continue. Разберём, что из этого реально пригодится в коде уже сейчас.
https://uproger.com/csharp-15-union-types/
| 2 | 🛠 У .NET появился свой аналог rustup и nvm
Microsoft представила dotnetup: менеджер для установки и обновления .NET SDK и рантаймов. Пока в публичном превью.
Всё устанавливается в папку пользователя, без sudo и прав администратора. Можно держать стабильные версии, превью и ежедневные сборки рядом, а закрепление SDK через global.json сохраняется.
Несколько полезных команд:
dotnetup init # Настроить окружение
dotnetup list # Показать установленные версии
dotnetup update # Обновить отслеживаемые версии
dotnetup sdk install preview # Установить превью SDK
Можно отслеживать обновления внутри конкретной ветки или закрепить точную версию. При обновлении ненужные компоненты очищаются автоматически.
https://devblogs.microsoft.com/dotnet/introducing-dotnetup/ | 1 430 |
| 3 | Helm-чарты прямо из C#, без запуска `helm` 🛠
HelmSharp позволяет рендерить шаблоны и управлять релизами Kubernetes внутри .NET-приложения.
Что умеет:
• Загружать чарты из папки и .tgz.
• Объединять values.yaml с пользовательскими параметрами.
• Упаковывать чарты и работать с HTTP-репозиториями.
• Устанавливать, обновлять, откатывать и удалять релизы.
• Хранить историю релизов в Kubernetes Secrets, совместимых с Helm v3.
Для начала:
dotnet add package HelmSharp.Action
Поддерживает .NET 8, 9 и 10, лицензия MIT.
Пригодится для собственных панелей управления и сервисов деплоя на C#. Совместимость с Helm пока частичная: свои чарты стоит проверить, особенно если они используют сложные шаблонные функции или расширения.
https://github.com/GaTTGeng/HelmSharp | 1 125 |
| 4 | Тестировщик fullstack: C#-автоматизация и ручные тесты
Если вы хотели работать на сильном продукте в гибком графике – это вакансия для вас.
Задачи
• Разрабатывать автотесты на C# и улучшать тестовый фреймворк
• Проводить полный цикл тестирования и отчитываться по релизам
• Разбирать инциденты вместе с заказчиком
Какие навыки нужны
• Опыт в тестировании веб-приложений от 2 лет
• Автоматизация на C#, знание REST API, SQL/NoSQL, брокеров сообщений и CI/CD
Условия
• Зарплата в рынке и премия по результатам работы
• Полная удалёнка или гибридный график (есть ИТ-хабы в Москве, Санкт-Петербурге и Екатеринбурге)
• Поддержка сообщества QA Talks
• Технический трек развития
Оставляйте отклик по ссылке. | 1 177 |
| 5 | 🔐 Passkeys можно использовать как второй фактор в ASP.NET Core.
Пользователь вводит пароль, затем подтверждает вход через Touch ID, Windows Hello или аппаратный ключ. Без SMS и шестизначных кодов.
Маартен Баллиау показал реализацию на ASP.NET Core Identity в .NET 10: провайдер второго фактора, временная cookie и два эндпоинта для запроса и проверки passkey.
Есть важный нюанс: `PasskeySignInAsync()` выполняет прямой вход и обходит отдельный этап 2FA. Поэтому в таком сценарии нужно проверить, что passkey принадлежит именно пользователю, который уже прошёл проверку пароля.
Полезный разбор для тех, кто хочет добавить устойчивый к фишингу второй фактор в существующее приложение.
https://blog.maartenballiauw.be/posts/2026-10-01-using-aspnet-core-passkeys-for-second-factor-authentication/ | 1 271 |
| 6 | 🔐 Как аутентифицировать SSE в ASP.NET Core?
SSE работает поверх обычного HTTP и поддерживает аутентификацию. Подвох в браузерном `EventSource`: он не позволяет задать заголовок Authorization.
В статье Paul Karam разобраны варианты:
• Cookies: браузер отправляет их автоматически для своего origin. Для другого нужны withCredentials: true и корректный CORS.
• Одноразовый короткоживущий токен в URL: при переподключении придётся получить новый.
• `@microsoft/fetch-event-source`: позволяет передать Bearer-токен в заголовке.
• `HttpClient`: вариант для .NET-клиентов с обычными заголовками аутентификации.
Долгоживущий access token в URL может утечь через логи сервера или прокси. На сервере SSE-эндпоинт защищается стандартными средствами ASP.NET Core, например .RequireAuthorization() при cookie-аутентификации.
[https://tiger4589.github.io/2026/10/02/sse-with-authentication.html](https://tiger4589.github.io/2026/10/02/sse-with-authentication.html) | 1 649 |
| 7 | Задачка по C# 14: сколько раз вызовется Next()?
int calls = 0;
int Next() => ++calls;
Box? a = null;
Box b = new();
a?.Value = Next();
b?.Value = Next();
a?.Value += Next();
b?.Value += Next();
Console.WriteLine($"{calls} {b.Value}");
class Box
{
public int Value
{
get;
set => field = value * 10;
}
}
Варианты:
A) 4 120
😎 2 120
C) 2 30
D) Код не скомпилируется
Ответ: B) 2 120
Здесь сразу две фичи C# 14.
Первая: null-conditional assignment. Теперь ?. можно ставить слева от присваивания, в том числе составного. Главный подвох в том, что если объект слева равен null, правая часть вообще не вычисляется. Поэтому для a функция Next() ни разу не вызывается, и счётчик доходит только до 2, хотя вызовов в коде четыре.
Вторая: ключевое слово `field`. Геттер остаётся автоматическим, а сеттер умножает значение на 10, обращаясь к скрытому полю без ручного объявления.
Считаем по шагам:
```
b?.Value = Next() → Next() = 1, сохраняем 1 * 10 = 10
b?.Value += Next() → читаем 10, Next() = 2, 10 + 2 = 12, сохраняем 120
```
Бонусный подвох: b?.Value++ уже не скомпилируется. Составное присваивание с ?. разрешено, а инкремент и декремент нет. | 1 561 |
| 8 | 🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК
Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;
📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце можно задать любой вопрос.
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot
Реклама.
О рекламодателе. | 743 |
| 9 | «Ядро Windows NT во многом превосходит Linux», считает исследовательница Google и бывший реверс-инженер Microsoft Лори Кирк.
Её аргумент касается устройства системы: в NT ресурсы представлены объектами с правами доступа. В Linux контроль строится из нескольких механизмов, включая права файлов, ACL, capabilities и SELinux. По мнению Кирк, из-за этого труднее ответить на вопрос: что именно разрешено ИИ-агенту, которому дали доступ к системе?
Кирк считает, что ядро, спроектированное с нуля в 2026 году, скорее напоминало бы NT, чем Linux. Ей возражают: отдельные механизмы дают Linux гибкость, которая помогла ему стать основой серверов и контейнеров.
Это спор об архитектуре и управлении доступом, а не доказательство, что одна ОС безопаснее другой.
Источник: https://www.windowslatest.com/2026/09/26/google-researcher-explains-why-windows-nt-puts-linux-to-shame-and-imagines-an-alternate-history-where-it-won/ | 2 065 |
| 10 | Ваш .NET API работает локально. Готов ли он к продакшену?
Чек-лист из 8 проверок перед релизом. Он посвящён решениям, которые позже влияют на поиск ошибок, поддержку API и внесение изменений. Удобно пройтись по нему перед выкладкой, даже если все эндпоинты уже отвечают как надо.
[Читать статью](https://mwaseemzakir.substack.com/p/before-your-net-api-goes-to-production)
#aspnetcore #dotnet | 2 222 |
| 11 | 🧩 C# Channels: сообщение попало в очередь. Почему обработчик его не получил?
Два воркера читают один ограниченный канал. Один из них отменяет ожидание. Продюсер успешно записывает сообщение — без исключений.
using System.Threading.Channels;
var queue = Channel.CreateBounded<int>(
new BoundedChannelOptions(1)
{
FullMode = BoundedChannelFullMode.Wait
});
using var cts = new CancellationTokenSource();
var firstRead = queue.Reader.ReadAsync().AsTask();
var firstWorker = Task.Run(async () =>
{
try
{
var item = await firstRead.WaitAsync(cts.Token);
Console.WriteLine($"A: {item}");
}
catch (OperationCanceledException)
{
Console.WriteLine("A: canceled");
}
});
// Дожидаемся, чтобы первый воркер обработал отмену.
cts.Cancel();
await firstWorker;
var secondWorker = Task.Run(async () =>
{
await foreach (var item in queue.Reader.ReadAllAsync())
Console.WriteLine($"B: {item}");
});
await queue.Writer.WriteAsync(42);
queue.Writer.TryComplete();
await secondWorker;
await queue.Reader.Completion;
Console.WriteLine("Finished");
Разберите без запуска:
1. Что выведет программа? Возможны ли разные результаты?
2. Где окажется 42, если ни один воркер его не напечатает?
3. Почему Reader.Completion успешно завершится?
4. Чем отличаются эти две записи?
reader.ReadAsync().AsTask().WaitAsync(token)
reader.ReadAsync(token).AsTask()
Усложнение: отмена и запись происходят одновременно. Достаточно ли второй записи, чтобы гарантировать, что сообщение не потеряется?
Предложите протокол остановки: после извлечения сообщение должно быть обработано либо явно сохранено для повторной попытки. Очередь остаётся ограниченной, обработчики могут завершаться с ошибкой.
👇 В какой момент ответственность за сообщение переходит от канала к воркеру? | 2 118 |
| 12 | Эта задача проверяет понимание Memory<T>, pooling, ownership, IAsyncEnumerable, cancellation и одной из самых неприятных категорий ошибок высокопроизводительного C# — когда GC защищает объект от удаления, но не защищает вас от повторного использования его содержимого. | 1 755 |
| 13 | # C# 14: хитрая задача на ArrayPool, IAsyncEnumerable и время жизни памяти
Есть поток данных, из которого нужно читать сообщения построчно без лишних аллокаций.
Наивная реализация:
static async IAsyncEnumerable<ReadOnlyMemory<byte>> ReadLinesAsync(
Stream stream,
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
byte[] buffer = ArrayPool<byte>.Shared.Rent(4096);
try
{
while (true)
{
int read = await stream.ReadAsync(buffer, cancellationToken);
if (read == 0)
yield break;
yield return buffer.AsMemory(0, read);
}
}
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
}
Использование:
await foreach (var data in ReadLinesAsync(stream))
{
queue.Add(data);
}
Код компилируется и выглядит эффективно.
Но в production данные внутри queue иногда внезапно меняются или повреждаются.
## Вопрос
Почему?
---
# Проблема
ReadOnlyMemory<byte> не владеет памятью.
Он всего лишь указывает на:
byte[] buffer
А этот массив взят из:
ArrayPool<byte>.Shared
После следующего:
ReadAsync(buffer)
содержимое массива перезаписывается.
А после:
ArrayPool<byte>.Shared.Return(buffer);
массив вообще может получить другой поток.
Получается:
yield memory
↓
consumer сохраняет ссылку
↓
buffer переиспользуется
↓
старый ReadOnlyMemory показывает новые данные
Это логический аналог use-after-free, хотя runtime C# остаётся memory-safe.
---
# Задача
Исправьте API так, чтобы:
- использовался пул памяти;
- данные можно было безопасно хранить после yield;
- не происходило скрытого копирования каждого сообщения;
- consumer явно управлял временем жизни буфера;
- отмена работала через CancellationToken.
Подсказка: используйте
IMemoryOwner<byte>
---
# Один из вариантов решения
public sealed class Message : IDisposable
{
private IMemoryOwner<byte>? _owner;
public ReadOnlyMemory<byte> Data { get; }
public Message(IMemoryOwner<byte> owner, int length)
{
_owner = owner;
Data = owner.Memory[..length];
}
public void Dispose()
{
_owner?.Dispose();
_owner = null;
}
}
Чтение:
static async IAsyncEnumerable<Message> ReadAsync(
Stream stream,
[EnumeratorCancellation] CancellationToken cancellationToken = default)
{
while (true)
{
IMemoryOwner<byte> owner =
MemoryPool<byte>.Shared.Rent(4096);
int read;
try
{
read = await stream.ReadAsync(
owner.Memory,
cancellationToken);
}
catch
{
owner.Dispose();
throw;
}
if (read == 0)
{
owner.Dispose();
yield break;
}
yield return new Message(owner, read);
}
}
Consumer:
await foreach (var message in ReadAsync(stream, ct))
{
using (message)
{
Process(message.Data);
}
}
Теперь память возвращается в pool только тогда, когда consumer закончил с сообщением.
---
# Главная ловушка
Даже такой код опасен:
ReadOnlyMemory<byte> saved;
await foreach (var message in ReadAsync(stream))
{
using (message)
{
saved = message.Data;
}
}
Console.WriteLine(saved.Length);
После Dispose() память больше не принадлежит consumer.
Сам ReadOnlyMemory<byte> технически существует, но использовать его содержимое уже нельзя.
---
# Вопрос уровня Senior
Как изменить API так, чтобы разработчику было сложнее случайно сохранить ReadOnlyMemory<byte> после Dispose()?
Дополнительно подумайте:
ArrayPool<T>
vs
MemoryPool<T>
vs
обычный byte[]
и ответьте, когда zero-copy действительно быстрее, а когда управление lifetime становится дороже простой копии. | 1 607 |
| 14 | # C# 14: конкурентный кеш без race condition
Реализуйте потокобезопасный кеш:
public sealed class AsyncCache<TKey, TValue>
where TKey : notnull
{
public Task<TValue> GetOrCreateAsync(
TKey key,
Func<CancellationToken, Task<TValue>> factory,
CancellationToken cancellationToken = default)
{
// TODO
}
}
Условия: если 100 потоков одновременно запросят один key, factory должна выполниться только один раз. Остальные ждут тот же Task. Если вычисление завершилось ошибкой - запись удаляется из кеша. Отмена одного клиента не должна отменять работу для остальных. Глобальный lock использовать нельзя.
Вопрос: как избежать race condition между созданием общего Task и удалением упавшего значения из кеша? | 1 356 |
| 15 | 🔍Тестовое собеседование с Senior C# разработчиком уже завтра
15 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle C# разработчика.
Как это будет:
📂 Александр Моргунов, старший C# разработчик с опытом 7+ лет в Европейских высоконагруженных сервисах, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Александр будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Александру
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_csharp_bot
Реклама.
О рекламодателе. | 1 258 |
| 16 | 🔧 Как передать многострочный PEM через Aspire в ASP.NET Core
Сертификаты и ключи в PEM содержат переносы строк, которые могут создавать проблемы при передаче через параметры Aspire. Damien Bod показал обходной вариант для локальной разработки с User Secrets и развёртывания в Azure.
Схема простая:
* закодировать PEM в однострочный Base64
* сохранить значение в конфигурации AppHost под ключом Parameters:ИмяПараметра
* объявить приватный ключ через AddParameter(..., secret: true)
* передать параметр приложению через WithEnvironment
* в ASP.NET Core декодировать Base64 обратно в исходный PEM
В статье есть helper-класс для преобразования, настройка AppHost и пример создания сертификата через X509Certificate2.CreateFromPem.
Base64 сохраняет переносы строк при передаче. Приватный ключ после кодирования остаётся секретом: Base64 не обеспечивает шифрование.
https://damienbod.com/2026/09/01/using-multiline-parameters-for-aspire-and-asp-net-core-with-user-secrets-and-azure-default-deployments/ | 1 708 |
| 17 | Согласны ? | 1 769 |
| 18 | ⚡️ Задачи с технических собеседований в одном репозитории
Tech-OA-Interview-Questions - подборка задач из онлайн-тестирований и интервью в технологических компаниях. Пригодится для подготовки к алгоритмическим этапам отбора.
OA, или Online Assessment, - тестирование, которое кандидат обычно проходит перед собеседованиями. В репозитории собраны материалы для подготовки к таким заданиям, в том числе к отбору в Amazon.
Можно использовать как список для практики: решать задачи с таймером, оценивать сложность решения и проверять граничные случаи.
https://github.com/perixtar/Tech-OA-Interview-Questions | 2 031 |
| 19 | RabbitMQ в Production: Transactional Outbox, идемпотентность и DLQ в ASP.NET Core
Отправить сообщение в RabbitMQ несложно. Гораздо сложнее сделать так, чтобы система продолжала работать корректно в production: сообщения не терялись, не обрабатывались повторно, а ошибки не приводили к бесконечным ретраям и дублированию данных.
На открытом уроке 17 сентября в 20:00 разберем типичные проблемы при построении событийно-ориентированных систем и рассмотрим проверенные подходы к их решению. Поговорим о паттерне Transactional Outbox, идемпотентности, и покажем, как Dead Letter Queue (DLQ) помогает работать с ошибками. Примеры на ASP.NET Core и RabbitMQ, но подходы применимы и к другим брокерам.
Урок для backend-разработчиков, строящих микросервисные архитектуры, и инженеров, желающих довести event-driven системы до промышленной надежности.
👉 Записаться: https://otus.pw/PWKD/?erid=2W5zFHxScpR
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. | 856 |
| 20 | ✔️ Polly становится платной, но у .NET остаётся бесплатная альтернатива
Polly много лет была одной из главных библиотек .NET для устойчивости к временным сбоям: retry, timeout, fallback, rate limiting и circuit breaker.
Теперь Polly движется в сторону платной модели, но Microsoft.Resilience по-прежнему можно использовать бесплатно.
С .NET 8 работа с resilience стала заметно проще: появился новый API Polly и официальные библиотеки Microsoft для построения resilience pipelines.
Что можно настроить:
- Retry
- Fallback
- Timeout
- Rate limiting
- Circuit breaker
Хороший разбор того, как собирать устойчивые cloud-приложения на современном .NET:
https://milanjovanovic.tech/blog/building-resilient-cloud-applications-with-dotnet | 1 667 |
