dmitgu (dmitgu) wrote,
dmitgu
dmitgu

Category:

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

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

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

17. Создадим новый проект - взяв в качестве шаблона консольное приложение.  В VS 2013 expretion for Web нет шаблона консольного приложения. Поэтому проще всего зайти в VS 2013 expretion for Desktop (тоже доступно бесплатно в бесконечное пользование) и там сделать проект на основе шаблона и сохранить его. Затем вернуться в наш прежний проект и включить в решение наш новый консольный проект. Он будет использоваться для запуска нашего веб-приложения в режиме самохостинга. Если посмотреть в папке bin проекта Home сейчас, то там нет исполняемых файлов - есть файлы с расширением «.dll», но с расширением «.exe» - нет. Вот сейчас мы и создадим такой файл. Для этого изменим текст в файле Program.cs на следующий:

Program.cs

namespace HomeDesktopApp

{

            using System;

            using Nancy.Hosting.Self;

            using Home;

           

            class Program

            {

                           static void Main(string[] args)

                           {

                              var nancyHost = new NancyHost(new Uri("http://localhost:8085/"));

                                nancyHost.Start();

                                Console.WriteLine("Service started! Press any key for stop.........");

                              Console.ReadKey();

                                          

                                nancyHost.Stop();

                              Console.WriteLine("Service stoped!");

                           }

            }

}

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

19. Теперь нужно в нашем проекте консольного приложения поставить ссылку на наше веб-приложение. Для этого в обозревателе решений в проекте HomeDesktopApp правой кнопкой мыши щелкнуть на подразделе References и выбрать «Добавить ссылку». На вкладке Решение - Проекты поставить галку рядом с именем «Home».

20. Добавить файлы и зависимости из Nancy.Hosting.Self в проект HomeDesktopApp. Как это делается - было написано в первых пунктах выше. Только маленькое уточнение - теперь у нас два проекта и нам надо задать, куда ставить пакет. Поэтому делаем это такой командой: «Install-Package Nancy.Hosting.Self -ProjectName HomeDesktopApp».

21. И надо задать «Путь вывода» для скомпилированных файлов. Причины разбирались, когда мы копировали директорию Views в папку bin. Но теперь мы заставим VS сразу класть готовую прогу в нужный корневой каталог, который содержит подкаталог views. Корневой каталог -  это нашего проекта Home. Обратите внимание, что готовая прога из проекта HomeDesktopApp должна компилироваться и оказываться в директории проекта Home. Сделать это надо так: Вызвать «Свойства» проекта HomeDesktopApp (через контекстное меню в Обозревателе решений) и на вкладка «Сборка» в пункте «Путь вывода» задать каталог проекта Home.

22. Не забываем, что мы хотим запустить хостинг - поэтому делать это надо с правами администратора. В частности, при написании и отладке проги - нам надо запускать VS с правами админа. Если так и есть (иначе надо выйти и войти с нужными правами обратно в VS) становимся на окошко Program.cs и запускаем сборку и исполнение клавишей F5. Стоять надо на окошке с текстом Program.cs потому, что VS запускает именно тот проект в решении (если это не задано явно), какой сейчас текущий. А готовое приложение можно запускать и щелчком по файлу HomeDesktopApp.exe - но щелчком правой кнопки мыши, и «Запуск от имени администратора».

23. Появится окошко консольного режима с сообщением о запуске веб-сервера. После этого запускаем браузер и задаем там адрес http://localhost:8085/ и наслаждаемся результатом.

Многое из сделанного (я это прочитал после того, как сделал сам - но образцы кода по частям видел в других местах) я обнаружил в:

Создаем первое приложение на NancyFX. Часть шестая. Nancy.Selfhosting

Если кто хочет предыдущие 5 частей почитать, то вот они:

Создаем первое приложение на NancyFX

Создаем первое приложение на NancyFX. Часть вторая. Bootstrapper

Создаем первое приложение на NancyFX. Часть третья. Модули Nancy.

Создаем первое приложение на NancyFX. Часть четвертая. Продолжаем работу с модулями

Создаем первое приложение на NancyFX. Часть пятая. Super Simple View Engine

Однако по приведенной ссылке о проге с самохостингом не разобрана работа с файлом Index.sshtml - а это принципиальный момент, там много нюансов и мы будем строить на этом хостинг. У меня не сразу все получилось, но благодаря «Lift your Petticoats with Nancy....» разобрался. И еще раз напомню о необходимости запускать прогу от имени админа. Можно написать простенький ярлык чтоб запускать обычным щелчком (не от админа), можно консольное приложение сделать скрыты, но для простоты мы не будем тут это делать.

24. Итак, у нас запускается пока единственный файл -  Index.sshtml. А если мы попробуем записать в директории views другой файл (пусть My_page.html) и открыть его из браузера по адрессу http://localhost:8085/My_page.html - получиться?

My_page.html

<!DOCTYPE html>

<html lang="ru">

<head>

            <meta charset="utf-8" />

            <title>Моя страница!</title>

</head>

<body>

            <p><strong>
                  Проверка! Загружает ли веб-сервер ASP.NET MVC
                  обычную HTML страницу.
              </strong></p>

            <p><strong>Если данная страница загрузидась, то - да!</strong></p>

</body>

</html>

25. Нет, не запустилось и в браузере возникло сообщение об ошибке. Как решить проблему? А вот добавлю-ка я в конструктор HomeModule (после return View["Index.sshtml"];  }; - после фигурной скобки с точкой с запятой) такой код:

        Get["/views/My_page.html"] = parameters =>

        {

            return View["My_page.html"];

        };

26. Сработало! Но тут задан конкретный файл, а нам нужно, чтоб можно было запускать любой html-файл из директории views. Но есть способ в Nancy - обозначать название директории/файла (или их части) переменной в фигурных скобках. Подобные переменные "разрешают" любые символы для названий директорий и файлов (которые разрешены операционной системой), а какие это были последовательности символов - эти переменные запоминают внутри себя в виде строк (могут запоминать и числа и не только, но не будем тут углубляться). Поэтому попробуем вот что вместо предыдущего:

        Get["/views/{fname}.html"] = parameters =>

        {

            return View[parameters.fname +".html"];

        };

27. Есть! После запуска проги и запуска (вручную) браузера - по адресу http://localhost:8085/My_page.html показалась наша страница. Хотя в коде View[parameters.fname +".html"] есть ошибка - надо было ставить "../" перед строкой parameters.fname. Подробнее - в комментарии для следующего варианта, где даже каталог может быть разным (а не только views):

        Get["/{dir0}/{fname}.html"] = parameters =>

        {

            return View["../../" + parameters.dir0 + "/"
                                      + parameters.fname +".html"];

        };

28. Даа! Не знаю пока, как со скриптами, таблицами стилей и картинками, но файлы .html при самохосте Нэнси работают!

Комментарий: И нужно учесть, что на самом деле в модуле HomeModule - он ищет изначально в views/Home, а после ищет в старших, если не нашел где просили. Поэтому у меня возврат на 2 старших уровня ("../../") - я же отсчитываю не от уровня каталога views, а от старшего для него.

29. Но когда я пытаюсь расположить файл .html в каталоге старше уровня каталога views - ошибка 404. Получается, что при таком подходе я могу располагать свои статические страницы только в каталоге views и вложенных в него. Сейчас мы создали условия для работы с html-файлами расположенными непосредственно внутри папки views (но не в подпапках папки views). Но мы можем увеличить уровень вложенности до нужного. Например, чтоб были доступны файлы, лежащие как в самом каталога views, так и в подпапках папки views (но не в под-под-папках views). Тогда HomeModule.cs будет таким:

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"];

        };

        Get["/{dir0}/{fname}.html"] = parameters =>

        {

            return View["../../" + parameters.dir0 + "/" + parameters.fname + ".html"];

        };

        Get["/{dir0}/{dir1}/{fname}.html"] = parameters =>

        {

            return View["../../" + parameters.dir0 + "/" + parameters.dir1 + "/" + parameters.fname + ".html"];

        };

    }

}

}

30. Ясно, что таким образом можно легко увеличить вложенность до любого уровня. То есть - самохостинг на компьютере отдельного пользователя реализуется весьма легко, в принципе. Нюансы еще предстоит разобрать, но слияние методов разработки программ для «настольного» и «сетевого» пользователя уже пошло на практическом уровне.

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.
  • 2 comments