Skip to content

Simple steps for running in-process kestrel rest web server

License

Notifications You must be signed in to change notification settings

junecat/KestrelExample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KestrelExample

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 - запросы.

Шаг 1.

Напишем простое консольное NET Core приложение. Обычный шаблон консольного приложения просто печатает "Hello world!" в консоли. Теперь добавим код, котрый запускает веб-сервер. Пропустив несколько скучных шагов, я приведу сразу пример кода:

Несколько пояснений.

Для того, чтобы этот код скомпилировался, нужно сделать доступным простанства имён, находящиеся в пакете Microsoft.AspNetCore. Для этого нужно в файл проекта *.csproj добавить секцию

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

В результате при любом обращении к любому адресу http://localhost:5000/<что угодно> мы получаем страницу с надписью "Hello, world".

Шаг 2.

Добавляем статические страницы. Для этого понадобится сделать три дополнения:

а) Добавить в строку конфигурирования 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 я получаю статическую страницу

Шаг 3.

Теперь нам осталось добавить REST. Здесь пришлось сделать немного больше телодвижений, и я долго мучался, стараясь назначить кастомный роутинг на разные энпоинты. В конце концов я сдался, и оставил то, что называется роутингом по умолчанию.

Тогда суть сводится к добавлению в конфигурацию сервисов строки services.AddControllers();

а в конфигурацию приложения двух дополнительных опций:

        app.UseRouting();

и app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

С самими контроллерами я не стал возиться, и просто скрестил свой пример с известным майкросфтовским примером WeatherForecast, ну и написал еще один очень примитивный контроллер MyController

Результат: При обращения http://localhost:5000/WeatherForecast и http://localhost:5000/My у меня выводятся результаты работы метода Get контроллеров, а статическая страница тоже осталась на месте.

Все три шага лежат в гитхабе в виде отдельных микропроектов.

Такой способ позволяет встроить простой рест - сервер в своё приложение и, например, добавить "красивую веб панель управления" к консольной утилите.

Спасибо за внимание.

About

Simple steps for running in-process kestrel rest web server

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published