Simple steps for running in-process kestrel rest web server
asp.net - технология, которую Microsoft приготовила на замену более старой технологии Microsoft ASP. В то же время asp.net была неразрывно связана с Windows и IIS (ну, или IISExpress - при локальной разработке и отладке). IIS - прекрасный сервер, но иногда хочется чего то более компактного. Ведь для минимального веб-сервера нужно не так уж много кода. И с появлением NET Core появилась простая возможность использовать кроссплатформенный web-сервер, называемый kestrel (полное название - Microsoft.AspNetCore.Server.Kestrel).
Кроме кросплатформенности, плюсом kestrel является возможность встроить его в своё приложение. Давайте попробуем решить минимальную задачу: написать консольное приложение, ктоорое имеет встроенный веб-сервер, который умеет отображать статические страницы и отвечать на REST - запросы.
Напишем простое консольное NET Core приложение. Обычный шаблон консольного приложения просто печатает "Hello world!" в консоли. Теперь добавим код, котрый запускает веб-сервер. Пропустив несколько скучных шагов, я приведу сразу пример кода:
Несколько пояснений.
Для того, чтобы этот код скомпилировался, нужно сделать доступным простанства имён, находящиеся в пакете Microsoft.AspNetCore. Для этого нужно в файл проекта *.csproj добавить секцию
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
В результате при любом обращении к любому адресу http://localhost:5000/<что угодно> мы получаем страницу с надписью "Hello, world".
Добавляем статические страницы. Для этого понадобится сделать три дополнения:
а) Добавить в строку конфигурирования WebHost директиву UseWebRoot("static"): строка var host = new WebHostBuilder().UseKestrel(GetKso()).UseContentRoot(Directory.GetCurrentDirectory()).UseStartup().Build(); меняется на var host = new WebHostBuilder().UseKestrel(GetKso()).UseContentRoot(Directory.GetCurrentDirectory()).UseStartup().UseWebRoot("static").Build();
б) В список сервисов, которые добавляются в приложение, нужно добавить app.UseStaticFiles();
в) Создать саму папку static и положить туда хотя бы один файл
Результат: при запросе http://localhost:5000/index.html я получаю статическую страницу
Теперь нам осталось добавить REST. Здесь пришлось сделать немного больше телодвижений, и я долго мучался, стараясь назначить кастомный роутинг на разные энпоинты. В конце концов я сдался, и оставил то, что называется роутингом по умолчанию.
Тогда суть сводится к добавлению в конфигурацию сервисов строки services.AddControllers();
а в конфигурацию приложения двух дополнительных опций:
app.UseRouting();
и app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
С самими контроллерами я не стал возиться, и просто скрестил свой пример с известным майкросфтовским примером WeatherForecast, ну и написал еще один очень примитивный контроллер MyController
Результат: При обращения http://localhost:5000/WeatherForecast и http://localhost:5000/My у меня выводятся результаты работы метода Get контроллеров, а статическая страница тоже осталась на месте.
Все три шага лежат в гитхабе в виде отдельных микропроектов.
Такой способ позволяет встроить простой рест - сервер в своё приложение и, например, добавить "красивую веб панель управления" к консольной утилите.
Спасибо за внимание.