Sisk

Руководство (расширенная) настройка

Эта страница переведена с английского автоматически. Читать оригинал

Используйте ручную настройку, когда вам нужно собрать части сервера самостоятельно, например, когда один процесс должен предоставлять несколько хостов, портов, маршрутизаторов или пользовательскую конфигурацию сервера. Для большинства приложений API построителя короче и предпочтительнее. Ручная настройка полезна, когда вы хотите прямой контроль над четырьмя основными компонентами: Router, один или несколько объектов ListeningHost, HttpServerConfiguration и конечным HttpServer.

Сначала нам нужно понять концепцию запрос/ответ. Она довольно проста: для каждого запроса должен быть ответ. Sisk следует этому принципу. Давайте создадим метод, который отвечает сообщением «Hello, World!» в HTML, указывая код статуса и заголовки.

C#
// Program.cs
using Sisk.Core.Http;
using Sisk.Core.Routing;

static HttpResponse IndexPage(HttpRequest request)
{
    HttpResponse indexResponse = new HttpResponse
    {
        Status = System.Net.HttpStatusCode.OK,
        Content = new HtmlContent(@"
            <html>
                <body>
                    <h1>Привет, мир!</h1>
                </body>
            </html>
        ")
    };

    return indexResponse;
}

Следующий шаг — связать этот метод с HTTP‑маршрутом.

Routers #

Маршрутизаторы — это абстракции маршрутов запросов и служат мостом между запросами и ответами сервиса. Маршрутизаторы управляют маршрутами сервиса, функциями и ошибками.

Маршрутизатор может иметь несколько маршрутов, и каждый маршрут может выполнять разные операции по этому пути, такие как выполнение функции, отдача страницы или предоставление ресурса с сервера.

Создадим наш первый маршрутизатор и свяжем метод IndexPage с индексным путём.

C#
Router mainRouter = new Router();

mainRouter.MapGet("/", IndexPage);

Теперь наш маршрутизатор может принимать запросы и отправлять ответы. Однако mainRouter не привязан к хосту или серверу, поэтому он не будет работать сам по себе. Следующий шаг — создать наш ListeningHost.

Listening Hosts and Ports #

Объект ListeningHost может размещать маршрутизатор и несколько прослушиваемых портов для одного и того же маршрутизатора. ListeningPort — это префикс, на котором HTTP‑сервер будет слушать.

Здесь мы можем создать ListeningHost, который указывает на два конечных пункта для нашего маршрутизатора:

C#
ListeningHost myHost = new ListeningHost
{
    Router = mainRouter,
    Ports = new ListeningPort[]
    {
        new ListeningPort("http://localhost:5000/")
    }
};

Теперь наш HTTP‑сервер будет слушать указанные конечные точки и перенаправлять запросы к нашему маршрутизатору.

Server Configuration #

Конфигурация сервера отвечает за большую часть поведения самого HTTP‑сервера. В этой конфигурации мы можем связать ListeningHosts с нашим сервером.

C#
HttpServerConfiguration config = new HttpServerConfiguration();
config.ListeningHosts.Add(myHost); // Добавляем наш ListeningHost в эту конфигурацию сервера

Общие параметры конфигурации сервера:

СвойствоЗначение по умолчаниюКогда использоватьПримечания
RemoteRequestsActionRequestListenAction.AcceptСервис должен отклонять запросы, не являющиеся локальными, если они не проходят через доверенный обратный прокси.Устанавливайте Drop только когда топология развертывания ясна.
IncludeRequestIdHeaderfalseКлиентам или прокси нужен идентификатор запроса Sisk в заголовке ответа X-Request-Id.Сочетайте с журналами, содержащими HttpRequest.RequestId.
IdleConnectionTimeout120 secondsНеактивные keep-alive соединения должны быть закрыты рано или поздно.Это применяется HTTP‑движком.
NormalizeHeadersEncodingsfalseВы получаете заголовки с несоответствием кодировок.Это требует затрат на обработку; оставляйте отключённым, если не требуется.
SendSiskHeadertrueВы хотите скрыть или показать заголовок Sisk X-Powered-By.Отключите его для более строгих политик заголовков в продакшене.
OptionsLogModeLogOutput.BothВы хотите уменьшить или перенаправить логи, генерируемые автоматической обработкой OPTIONS.Использует те же значения режима логирования, что и маршруты.
AsyncRequestProcessingtrueВам нужна детерминированная обработка одиночных запросов для диагностики.Отключение снижает пропускную способность.
DisposeDisposableContextValuestrueЗначения в контейнере запроса, реализующие IDisposable, должны автоматически освобождаться.Оставляйте включённым, если только владение не управляется в другом месте.
ConvertIAsyncEnumerableIntoEnumerabletrueОбработчики значений должны получать асинхронные перечисления как блокирующие перечисления.Отключите, если вы реализуете собственную обработку async‑stream.
KeepAlivetrueСоединения должны оставаться переиспользуемыми после ответов.Отключите для клиентов или посредников, которые плохо работают с постоянными соединениями.
ForceTrailingSlashfalseGET‑маршруты должны перенаправлять на URL с завершающим слэшем.Применяется только к маршрутам без регулярных выражений.
MaximumContentLength0Тела запросов нуждаются в ограничении размера.0 означает отсутствие ограничений, пока не достигнуты ограничения фреймворка или памяти.
EnableAutomaticResponseCompressionfalseОтветы должны автоматически сжиматься, если клиент поддерживает сжатие.Существующие ответы CompressedContent не сжимаются повторно.

Далее мы можем создать наш HTTP‑сервер:

C#
HttpServer server = new HttpServer(config);
server.Start();    // Запускает сервер
Console.ReadKey(); // Предотвращает завершение приложения

Теперь мы можем собрать наш исполняемый файл и запустить HTTP‑сервер командой:

Bash
dotnet watch

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

Sisk распространяется с открытым исходным кодом по лицензии MIT.

Начните вводить, чтобы искать по документации и справочнику API.