23 ноября 2013 в 12:32

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

.NET*
В завершении цикла статей хотелось бы описать такую важное преимущество NancyFX как Nancy.SelfHosting. Данный модуль Nancy позволяет нам хостить наше приложение без использования IIS, на тех операционных системах где есть .NET или же MONO. Давайте рассмотрим следующий пример использования данного модуля. Для начала создадим пустое консольное приложение.



Затем добавим в приложения с помощью NuGet Nancy и Nancy.Hosting.Self.



Добавим в наше приложение класс модуля с следующим кодом.

using Nancy;

namespace NancySelfHosting
{
    public class NancyFXModule : NancyModule
    {
        public NancyFXModule()
        {
            Get["/"] = param => "I'm Nancy Self Host Application.";
        }
    }
}


Далее модифицируем метод Main, класса Program слудеющим образом

using System;
using Nancy.Hosting.Self;

namespace NancySelfHosting
{
    class Program
    {
        static void Main(string[] args)
        {
            var nancyHost = new NancyHost(new Uri("http://localhost:1234"));
            nancyHost.Start();
            Console.WriteLine("Service started!");
            Console.ReadLine();
            nancyHost.Stop();
            Console.WriteLine("Service stoped!");
        }
    }
}


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



Далее запустим браузер и перейдем по адресу localhost:1234/. Мы увидим следующую картину:



Как видите теперь мы имеем полноценное веб приложение для запуска которого нам не требуется установленный и сконфигурированный IIS. Причем для реализации данного приложения нам понадобились буквально считанные минуты.

Так как данная статья была завершающей статьей цикла я хочу поблагодарить камрадов lexkazakov, kekekeks и других помогавших мне в создании данного цикла статей за их рецензии и советы. Большое спасибо всем людям следившим за данными статьями. Надеюсь я Вас не разачаровал своими опусами.
Николай Лотоцкий @Moozund
карма
15,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (11)

  • +1
    Спасибо вам за эту серию статей. Не знаю, воспользуюсь ли я когда-нибудь NancyFX, но было определенно полезно узнать, что в мире .NET есть альтернатива ASP.NET MVC.

    Посмотрел в профиль — мир тесен :).
  • +1
    Еще бы статью на тему запуска проектов в mono и вопросам миграции проектов visual studio xamarin studio и наоборот…
  • +2
    Было бы отлично, если бы автор добавил в пост ссылки на предыдущие статьи цикла
  • +2
    Учту, как доберусь до компьютера обязательно поставлю ссылки на предыдущие статьи.
  • 0
    Стоило указать, что для views (файлов) нужно выставить свойства:
    Build Action: None
    Copy always: Copy always

    Другими словами, шаблоны должны валяться рядом с.ехе
    Или есть другие варианты?
  • 0
    Да, вьюхи должны быть в бине. Извините за это упущение.
  • 0
    Еще один нюанс с Console.ReadLine(); в Linux при демонизации процесса вызывает EOF:

                nancyHost.Start();
                Console.WriteLine("Service started!");
                //Under mono if you deamonize a process a Console.ReadLine with cause an EOF 
                //so we need to block another way
                Thread.Sleep(Timeout.Infinite);
                nancyHost.Stop();
                Console.WriteLine("Service stoped!");
    
    • 0
      Thread.Sleep(Timeout.Infinite);

      Anvol, кто вас так научил? Никогда так не делайте.
      Для этого случая, на мой взгляд, идеально подходит что-то вроде AutoResetEvent.

      А если используете Mono, то лучше UnixSignals.
      • 0
        Вы не поверите, но взял с репозитория NancyFX:
        github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Nginx-on-Ubuntu
        • +1
          Если посмотреть историю, то там еще более ужасный ужас, оказывается.
          while (true) Thread.Sleep(10000000); 
          

          Думал такое только на первом курсе пишут…

          В общем, если использовать Mono, то лучше сделать так, на мой взгляд:
          try
          {
          	host.Start();
          
          	Console.WriteLine("Started at {0}", uri);
          
          	// Mono.Posix.dll
          	UnixSignal[] signals = new UnixSignal[]
          	{
          		new UnixSignal (Signum.SIGINT), 
          		new UnixSignal (Signum.SIGTERM), 
          		new UnixSignal (Signum.SIGQUIT)
          	};
          	UnixSignal.WaitAny(signals, -1);
          }
          catch (Exception e)
          {
          	Console.WriteLine(e.ToString());
          }
          finally
          {
          	Console.WriteLine("Shutting down.");
          	host.Stop();
          }
          
          • 0
            Согласен, так правильно, но не портируется. AutoResetEvent, пожалуй, лучший компромисс

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.