Comments 8
По Timeout в HttpClient, если совсем грубо и просто,
то всё просто он по факту идёт через SocketsHttpHandler и он уникален для каждого запроса в рамках одного httpклиента.
Использую Refit, либо чистый HttpClient.
Что Refit, что RestSharp -- обёртки над HttpClient. Refit даёт возможность писать простые клиенты декларативно. RestSharp особо ничего не даёт кроме дополнительного ненужного обвеса и лишних объектов в памяти. Всё что нужно, обычно, это использовать существующие методы расширений для HttpClient-а, либо написать несколько своих.
HTTP-запрос это не простой вызов метода, всё несколько сложнее. Во-первых, градация ответов это чуть больше, чем успех/неуспех. Если всё делать по феншую, сервер в случае ошибок должен возвращать ответ типа Problem Details, который нужно в отдельных случаях извлекать и обрабатывать. Polly на ретраях, разумеется. Во-вторых, ещё есть ответы, которые не являются ошибкой, но и классическим успешным ответом тоже не являются, это ответы 3xx, кеширование. В-третьих, передача файлов, потоковая передача данных, это отдельная история, которую нужно специальным образом обрабатывать.
Отсюда, и RestSharp и Refit являются лишними на празднике жизни. Пока есть несколько простых методов, абсолютно чёрно-белых, да/нет, успех/ошибка, а если ошибка то вообще пофиг, валимся с исключением с разбирательством только по логам, Refit ещё как-то вывозит. Но чуть шаг в сторону и начинаются лютые приседания. В общем, я бы настоятельно не рекомендовал использовать Refit, это такая мягкая подстилка над ямой, в которой торчат колья.
А можете добавить в бенчмарки измерение аллокаций и GC?
Согласно имеющейся документации, создавать новые экземпляры HttpClient каждый раз, когда нам нужно сделать HTTP-запрос - плохая идея. Система внутри себя поддерживает переиспользуемый пул соединений, следит за разными вещами, в общем происходит много неочевидной магии. Отсюда у меня возникает опасение, а не может ли так случиться, что один и тот же экземпляр HttpClient будет со временем передан разным сервисам. И время ожидания, установленное в одном из них, перетечёт таким образом в другой. Мне не удалось воспроизвести эту ситуацию, но, возможно, я чего-то просто не учёл.
На самом деле, плохо создавать много экземпляров HttpClientHandler. И именно эти экземпляры кэшируются в пул объектов у фабрики HttpClient-ов. А сам HttpClient каждый раз новый.
Пользовался RestSharp, перешел на Flurl, а потом обе эти либы начали ломать свое АПИ, релизить несовместимые версии и так далее. И ладно бы лучше что-то сделали, но нет, еще и багов добавили. И теперь я подумываю использовать голый HttpClient, потому как от этих либ больше вреда, чем пользы.
С Polly тоже самое, взяли и поменяли апи - иди переписывай, а апгрейд гайд очень скромный.
Сравнение HTTP-библиотек