dmitgu (dmitgu) wrote,
dmitgu
dmitgu

Category:

Настольный веб-сервер (часть 1 из 2) - делаем сами

Начало. Окончание - следующая запись.

У меня есть убеждение, что тенденцию развития пользовательских программ (настольных, корпоративных, игровых и т.п.) задают программы сетевые. Просто именно в Сети люди вынуждены приходить к общим соглашениям, которые неизбежно вытесняют частные. Это как человек думает на родном языке - хотя вроде мог бы думать и на каком-то «внутреннем» - так и развитие программ неизбежно направляется общепринятым в
IT, а общепринятое создается и навязывает себя в основном из Сети.

В связи со сказанным -  совершенно логично строить настольные приложения как приложения для интернета - этим ты опережаешь время и ускоряешь его. Да и логично использовать одинаковые подходы для работы как в Сети, так и с персональными программами - просто меньше надо заучивать, не теряя в универсальности.

Но если Вы попробуете использовать те же гипертекстовые страницы и браузер на компьютере (без Интернета), то их функциональность будет резко урезана, сравнительно с их работой в Сети. Просто в Сети действует специальная среда - хостинг. Эта вещь «вдыхает жизнь» в то, что видит и с чем манипулирует пользователь.

Хостинг является связующим звеном между клиентской частью (где пользователь делает свою часть работы) и программной частью, которая исполняет «машинную» часть работы, Такое разделение сложилось де-факто в Сети и очевидно, что такое же построение логично обеспечить и на компьютере, даже помимо Сети. И тогда массу наработок из Интернета можно переносить на отдельный комп в практически готовом виде.

Но до недавнего времени завести хостинг на компе было непростым делом. Хостинг придумывался для обслуживания тысяч пользователей, под обеспечение мощной безопасности и настройка программ (веб-серверов) для его создания не требовала ни спешки, ни простоты. А вот для отдельного пользователя возится с настройкой хостинга для себя одного, вкладывая усилия как для кучи челов - абсурдно. Для персонального применения хостинг должен легко возникать сам - при запуске программы и не парить вообще.

Я посматривал много лет - не появится ли легкий персональный «самохостинг» и вот - вроде наконец видно... Появилось ASP.NET Web API - это просто программная среда для работы в сети (когда есть хостинг), но теперь есть и проект Nancy, который работает с этой средой и обеспечивает довольно простой «самохостинг» на настольном компе.

Чтоб опробовать эту связку, мы поставим минимальную задачу: надо, чтобы html-файлы открывались в браузере не как файлы, а как ответы веб-сервера - как это и имеет место в сети. Тогда на следующем этапе мы уже сможем написать кучу программ, которые будут выполнять машинную часть работы «со стороны» веб-сервера и которая будет взаимодействовать с клиентской частью благодаря хостингу. Но это - в другой раз.

А сейчас нам надо построить простую прогу, которая будет «кормить» наш браузер нужными нам html-файлами посредством веб-сервера. Это откроет нам простор влиять на процессы и изменять данные через этот активный канал, а не просто тупо просматривать страницы. Вот такую прогу самохостинга нам нужно сделать. В упрощенном виде пока что.

Кое-что ещё о проекте Nancy, как показателе тенденции... Их наработки вполне применимы под разными операционными системами. Ведь среда .Net, под которую они сделаны - кроссплатформенная, как Java. (На Линуксе есть проект Mono, обеспечивающий среду для разработки и исполнения кода .Net). Тут мы видим продолжение той же тенденции унификации от Интернета. Сейчас проги пишут в байт-кодах, которые одинаково выполняются на разных компах, разных операционных системах - без перекомпиляции. Это логично  - тут можно строить из разных компов единую вычислительную среду и процессы вычисления могут переходить от компа к компу без необходимости перевода. Вот так требование «общего понимания» оказывается важнее стремления к «индивидуальной эффективности».

Это я и к тому (если брать нашу конкретную тзадачу), что мы получаем еще и дополнительный бонус - создавая нашу прогу в среде Windows, мы, по сути, не привязаны к операционной системе и результат получается весьма близким к кроссплатформенному.

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

1. В Visual Studio 2013 express for Web (VS доступно бесплатно и без ограничения времени) создадим новый проет (Меню-Файл-Создать проект). Там предложат набор шаблонов, надо выбрать: C# -Веб - Visual Studio 2012 - Пустое веб-приложение ASP.NET

2. Затем попадаем через меню «Сервис - Диспетчер пакетов NuGet - Консоль диспетчера пакетов» на консоль NuGet

3. Запускаем (пишем в консоли и жмем Enter) «Install-Package Nancy.Hosting.Aspnet» - это чтоб хостится на IIS (включая отладку в VS)

4. Запускаем «Install-Package Nancy.Viewengines.Razor» - это для специального скриптового серверного языка.

5. После предыдущих двух пунктов в наш набор файлов скопировались из интернета необходимые файлы и проставились нужные ссылки в web.config и т. п. Но необходимые пространства имен (типа «using Nancy;») в программе надо писать самому.

6. В проекте (в Обозревателе решений VS, щелкнув правой кнопкой мыши на Проекте и выбрав пункт контекстного меню «Добавить - Создать папку») создаем новую подпапку Modules.

7. Внутри папки Modules создаем (в Обозревателе решений VS, щелкнув правой кнопкой мыши на папке Modules и выбрав пункт контекстного меню «Добавить - Создать элемент - Класс») класс HomeModule.cs (такое название потому, что для запуска наша прога будет искать класс, имя которого кончается на «Module» - так построена Нэнси).

8. Пишем в этом классе следующее (обратите внимание на нестандартное расширение у файла Index.sshtml - об этом будет сказано при разборе самого файла):

HomeModule.cs

using Nancy;

using Nancy.Hosting.Aspnet;

using Nancy.ViewEngines.Razor;

namespace Home

{

public class HomeModule : NancyModule

{

  public HomeModule()

  {

      Get["/"] = parameters =>

      {

      // Простой вариант закомментировал. но работает он именно

      // так - что отличается от строки

      // (без return) - как написано в Нэнси

          // return "ee hoo! - no more little green monster...";

          // А следующая команда будет работать, только если

          // прога запущена из нужного каталога - в которой

      // находится подкаталог views с содержимым. А куда

      // класть прогу (скомпилированные файлы) - это нужно

          // задать в свойствах проекта, вкладка «Сборка»,

          // Пункт «Путь вывода».

         return View["Index.sshtml"];

      };

  }

}

}

9. Вызвать «Свойства» проекта (по контекстному меню) и переименовать на вкладке «Приложение» пункты «Имя сборки» и «Пространство имен по умолчанию» на «Home». И желательно переименовать файл проекта - его имя можно найти в Окне свойств, когда в Обозревателе решений выбран сам проект. Вот в окне свойств надо аккуратно поменять имя файла проекта на Home.csproj. После этого в обозревателе решений изменится название проекта на Home.

10. В проекте создаем новую папку Views (это потому, что вызовы View["Index.sshtml"] ищут свои файлы внутри папки Views).

11. В папке Views создаем новую папку Home (это потому, что обращаясь к папке Views из класса HomeModule наша прога ищет (так сделана среда Нэнси) в папке Views подпапку с именем Home (суффикс «Module» отбрасывается).

12. В папке Home создаем новый элемент Index.sshtml (в контекстном меню «Добавить - Страница представления MVC 5 Razor». Обратите внимание на расширение! Именно «.sshtml» - иначе при запуске проги вместо нашей страницы появится зеленый  монстр с сообщением что НЕ видно файла нужного типа. Это особенность Nancy - Nancy не воспринимает стандартного для «родного» ASP.NET Razor расширения «.cshtml», и при запуске обозревателя по корню http://localhost:8085/ дает ошибку 500, маленького зеленого монстра (картинку) и сообщения о допустимых расширениях. Среди них - «.sshtml». Поэтому, если не получится поменять расширение внутри обозревателя решений, то надо зайти в каталог views\Home, поменять расширение там и после этого включить этот существующий документ (через контекстное меню Обозревателя решений, щелкнув на папке views\Home правой кнопкой мыши и выбрав "Добавить существующий элемент") в проект.

13. В созданной странице представления пишем следующий текст:

Index.sshtml

<!DOCTYPE html>

<html>

<head>

<meta name="viewport" content="width=device-width" />

<title></title>

</head>

<body>

<div>

  Hay! Yaa! 1

</div>

</body>

</html>

14. Теперь, прежде чем запускать нашу прогу на исполнение (через F5) нам надо учесть, что вся эта последовательность директорий Views/Home/Index.sshtml должна быть видна из корня нашего проекта, а корень находится там (если не настраивать специально), откуда запускаются скомпилированные файлы проги. А при работе в среде VS for Web они генерируются в подпапке bin нашей папки проекта и в этой директории bin нет этих самых директорий и файлов Views/Home/Index.sshtml. Поэтому, сохранив проект (чтоб все файлы были последней версии) скопируйте поддиректорию Views со всем ее содержимым в папку bin. И после этого запускайте проект (клавиша F5). Если будут ошибки, то сравните с текстами тут и исправьте. Если все нормально - запуститься браузер.

15. Если браузер запустился, но покажет текст вроде «Не найдено», то убираем в браузере «хвост» адреса до корня (оставляем только адрес вида «http://localhost:62059/» - только число там может быть другое), вызываем его (можно нажать Enter в адресной строке браузера) и получаем в окне «Hay! Yaa! 1» - что мы и записали в Index.sshtml

Окончание - следующая запись.

Tags: ЖЖвЖЖ программирование, ИТ (информ. технологии)
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments