Мой первый сайт под .NET Core

Наши разработки мы ведём на C# и традиционно ориентировались на платформу Microsoft. Это себя оправдывало. Microsoft предоставляет хорошую экосистему для разработки: сервер, система управления базами данных, отчётность, средства разработки, управление разработкой и жизненным циклом приложений. Всё, что необходимо для систем электронного документооборота и, вообще, информационных систем в целом.

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

В своё время я присматривался к Mono, но технология показалась мне недостаточно устоявшейся и готовой к промышленному использованию. Когда на разработанных тобой системах работают десятки тысяч человек, чиновники уровня Губернатора Санкт-Петербурга… Как-то рисковать не очень хочется.

В своё время, выпустив первый .NET Framework в 2002 году, Microsoft делала ставку на мультиязычность: «одна платформа, один MSIL, много языков». Появился VB.NET, C#, managed C++, J#, Vista Smalltalk и Brainfuck.net компилятор делали. Однако, людям все же надо больше многоплатформенность, а не возможность писать на разных языках.  К языку, даже самому плохому, можно привыкнуть, а вот если нет средств переноса под другие операционные системы, то их взять неоткуда.

Осознание того, что C# сдаёт позиции Java именно по причине проприетарной платформы постепенно пришло в корпорацию зла.

Времена меняются и вот, уже Microsoft стала активно развивать тему open source. В 2011 году Microsoft представила открытый компилятор Roslyn, затем начался перенос .NET Framework под *nix – появился .NET Core. Хотя я выразился не совсем корректно. dotNET Core это не перенесённый .NET Framework, а новая реализация фреймворка, базирующаяся на несколько иных принципах.

Вообще, .NET Core выглядит очень привлекательно с точки зрения разработки:

  • Возможность создания многоплатформенных решений под windows, *nix, Mac OS;
  • Интеграция развёртывания с Docker;
  • Независимость от машинно-привязанного фреймворка в приложении – возможность скомпоновать и распространять те библиотеки, которые требуются только нашему приложению.
  • Гибкость на уровне используемых компонентов и доставка через NuGet.
  • Возможность запуска под Windows 2016 nano server;
  • Открытый код платформы, возможность изучить глубины .NET.

Инициатива, выглядящая, на первый взгляд, прекрасно. Хотя я и наблюдал «прорыв» в войне в DLL-hell, когда появилась технология OCX. Казалось бы, вот оно! Но…, впрочем, я отвлёкся…

А ещё .NET Core существенно уменьшенная платформа, ориентированная на создание облачных и серверных решений, из которой были исключены такие вещи, как ASP.NET WebForms, WPF, WinForms, WCF. Видимо, количество унаследованного кода переполнило чашу терпения разработчиков в MS, да и Presentation Framework не особо-то нужен на сервере! Экономия места, оперативной памяти на графических оболочках, сопутствующих компонентах и т.д. Это дорогого стоит! При использовании ЦОДов с большим количеством виртуальных машин экономия может выливаться в огромные цифры как в гигабайтах, так и в долларах. Велик соблазн переписать весь электронный документооборот на новую платформу!

С выходом Visual Studio 2017 release candidate и собственно .NET Core 1.0 мне стала интересна возможность создать приложение под Linux, Windows 2016 nano server и, вообще, приобщиться к новому.

Если вы совсем новичок в *nix, то сначала вам нужно поставить операционную систему. Это несложно, можно выбрать Debian, Ubuntu, Red Hat Linux Enterprise (сначала нужно её купить!), Fedora и т.д. Я выбрал Ubuntu 16.04 Server. Подробно, в картинках, установка показана тут, впрочем, человек с руками и головой разберётся. Создаём виртуальную машину, разворачиваем операционную систему!

После того, операционная система установлена, ставим свой любимый файловый менеджер, для меня это Midnight Commander.

Развёртывание приложения .NET Core 1.1. на Ubuntu 16.04

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

  1. sudo sh -c ‘echo «deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main» > /etc/apt/sources.list.d/dotnetdev.list’
  2. sudo apt-key adv —keyserver hkp://keyserver.ubuntu.com:80 —recv-keys 417A0893
  3. sudo apt-get update

На самом деле – обновляем репозиторий пакетов.

Далее, отойдём от инструкции с сайта Microsoft.

  1. sudo apt list dotnet-dev*

Вы получите список, примерно, как у меня:Перечень пакетов, доступных для установки dotnet .NET Core

Выберите версию, которая вам интересна. Я устанавливал preview3-004056-1, но через три дня появилась уже preview4-004233-1 и rc3-004530. Версии команда выпускает очень часто.

Установить пакет:

  1. sudo apt-get install dotnet-dev-1.0.0-rc3-004530

Немаловажно отметить, что в последних версиях Microsoft отказалась от поддержки Project.json в пользу *.csproj – файла несколько другого формата и совместимого с VS 2017 RC3.

Создаём приложение:

  1. Cd /Srv/ftp
  2. Mk CoreWebApp
  3. Dotnet new -t web
  4. Dotnet restore

Команда Dotnet new поддерживает:

-l|—lang <C#|F#>   Язык проекта. По умолчанию — C#. Другие допустимые значения: csharp, fsharp, cs и fs.

-t|—type   Тип проекта. Допустимые значения для C#: console, web, lib и xunittest; для F# допустимо только значение console.  Соответственно, выбранный нами тип web будет создавать веб-приложение.

Команда dornet restore восстанавливает зависимости и скачивает через NuGet требуемые пакеты.

Запускаем приложение:

  1. Dotnet run

Приложение компилируется, запускается, и говорит нам о том, что оно ждёт запросов на http://localhost:5000. Это прекрасно, но извне эта страница не доступна.

Если у вас есть локальный браузер (вы работаете из-под KDE), то вы можете увидеть болванку вашего приложения, пройдя ссылке выше.

Однако, мы хотим увидеть его из браузера хост-системы, нашей Windows 10. Для этого потребуется настроить реверс-прокси http-запросов, например, через nginx.

Устанавливаем его:

  1. sudo apt-get install nginx

Мы должны сконфигурировать nginx, конфиг его лежит тут: /etc/nginx/sites-available/default

Добавляем строчки:

Location / {
Proxy_pass http://localhost:5000;
Proxy_http_version 1.1;
Proxy_set_header Upgrade $http_upgrade;
Proxy_set_header Connection keep_alive;
Proxy_set_header Host $host;
Proxy_chache_bypess $http_upgrade;
}

Перезапускаем сервис nginx:
service nginx restart
Переходим по ip на свою гостевую машину и любуемся результатом в браузере:

Пример сайта dotnet core

DocPlace 2017-02-06

Добавить комментарий