Нет смысла в выделенном блоге

Нет смысла в выделенном блоге, т.к. есть пяток конкретных сервисов, где тусует IT-сообщество.
Потому и я туда двину, более чем полностью.

Частые посты можно отслеживать тут https://twitter.com/SanSYS

А редкие - https://habr.com/ru/users/sansys/posts/


Доступ root через TeamCity

GitHub оказался под крупнейшей DDoS атакой, немного обсудили в общем рабочем чате вечерком. Оказалось, что мало кто знает о замечательных поисковиках shodan.io и censys.io.

Ну и я интересу ради, прям для вау эффекта поискал TeamCity (далее тс), т.к. помню прикольный баг с регой в старых версиях.

Как оказалось, его даже не нужно было применять, т.к. во многих тс админы не закрывали регистрацию, а на некоторых доступен был вход под гостем.

Подробности на хабре >>

The older version of Microsoft Visual Studio ... cannot be removed

CustomAction  returned actual error code 1612 (note this may not be 100% accurate if translation happened inside sandbox)
MSI (s) (E8:3C) [12:22:03:070]: Product: Microsoft Visual Studio Team Foundation Server 2017 Office Integration Language Pack (x64) - ENU -- Error 1714. The older version of Microsoft Visual Studio Team Foundation Server 2017 Office Integration Language Pack (x64) - ENU cannot be removed.  Contact your technical support group.  System Error 1612.

https://support.microsoft.com/en-in/help/17588/fix-problems-that-block-programs-from-being-installed-or-removed - нужно скачать эту тулзу, выбрать приложение, которое не может быть нормально удалено и.. удалить

PostgreSQL: ERROR: missing chunk number 0 for toast

Оригинальная ошибка: ERROR: missing chunk number 0 for toast value 382548694 inpg_toast_847386
Исправление:
  1. REINDEX table pg_toast.pg_toast_847386;
  2. VACUUM ANALYZE <название таблицы>;

WebAPI: версионирование на основе HTTP-заголовков

Допустим, что для различных версий API существуют разные контроллеры
Если необходимо делать выбор контроллера на основании заголовка, то для этого предлагается определить свою имплементацию интерфейса IHttpControllerSelector в ServicesContainer

Какой именно HTTP-заголовок необходимо использовать особо не важно, будь то Accept, или свой, например - X-Version (я выбираю Accept, исключительно из любопытства)

Легче всего реализовать IHttpControllerSelector - создать наследника DefaultHttpControllerSelector:

Swagger: внедрение произвольных http-заголовков

Если при необходимости использования web api через swagger необходимо отправлять кастомные http-заголовки, то это можно сделать очень просто
  1. открываем SwaggerConfig
  2. ищем метод, переданный в EnableSwaggerUi
  3. вызываем InjectJavaScript у объекта, типа SwaggerUiConfig (передаётся в качестве первого аргумента обработчика)
  4. В качестве параметров необходимо передать :
    1. сборку, содержащую js в качестве рекурса
    2. название ресурса

Swagger: переадресация help page на swagger

Немного ранее было описано, как установить и использовать Swagger для использования в качестве автодокументации к Web API

Многие привыкли к адресу документации по адресу help/, но swagger отдаёт доку, конечно же, по своему адресу swagger/ui/index

Первое что приходит в голову - сделать свой собственный RedirectHandler, но в сборке Swashbuckle.Core уже таковой имелся :)

Собственно редиректим старую урлу на новую путём добавления следующего кода в метод Register класса SwaggerConfig


Теперь по обращении к help/ будет редирект на swagger/ui/index

Web API: автодокументация (Help Page / Swagger)

Иногда очень удобно вместе с API иметь страницу показывающую реализованные в данный момент интерфейсы/методы и модели

При создании Web API проекта из VS 2015 в настоящий момент предлагается ASP.NET Web API Help Page, и работает решение практически из коробки
Необходимо лишь решить - нужны ли комментарии к методам и свойствам моделей

Но в ASP .NET Web API Help Page есть существенные недостатки:
  • методы можно посмотреть, но нельзя вызвать тут же
  • для генерации моделей для PATCH требовались дополнительные телодвижения, например через метод SetSampleForType, а хочется всё же - большей гибкости (создал метод/модель - пользователи тут же могут её увидеть)
  • Когда бизнес-логика и модели отделены от Web API (собственно контракты/модели в одной библиотеке, а модели в другой, web api - в третьей) help pages не даёт возможности указать несколько XML-документов. Как следствие - необходимо их смёржить, а после - указывать базовый
  • Слишком много телодвижений (переходов меж страницами)
  • Нельзя указать список возвращаемых HTTP-кодов
т.е. получается вроде бы как результат есть, но что-то не то

Swagger же лишён всех этих недостатков
Проявил себя в самом лучшем виде и уже несколько месяцев после начальной настройки под себя - мы его боле не трогали (проект немного специфичный, необходимо иметь возможность отправлять кастомные http-заголовки).

Потому я и выбрал Swagger, успешно подсадив на него всю команду и, как результат - множество вопросов отпадает, тестировать методы можно до реализации клиента (человеческие тесты), да и просто приятно пользоваться.

Тем не менее сначала рассмотрим краткую инструкцию о том, как создать ASP .NET API Help Page, а после - перейти на Swagger

ASP.NET Web API: Отмена долгих запросов

В случае, если метод контроллера обращается к стороннему ресурсу, то время его выполнения определённо зависит от множества обстоятельств: количество данных/ширина канала, время обработки запроса сторонним ресурсом, длина очереди к ресурсу и т.п.

Чем это чревато: если запросов будет довольно много, то отправив много запросов можно заблокировать все потоки в пуле, тем самым сделав недоступным сервер для обработки новых запросов.

Как вариант - заюзать на фронте nginx

А если допустимо - принимать CancellationToken и передавать его в долговыполняющиеся операции

Это может понадобиться в случае, если пользователь может сам отменить запрос или ему надоело ждать и он закрыл браузер