Пустые ответы с использованием Nancy self host + TopShelf - PullRequest
5 голосов
/ 24 июня 2011

Я пытаюсь использовать Nancy (используя собственный хостинг с Razor для просмотра пакетов nuget) внутри службы Topshelf. Я размещаю его на http://localhost:8585/,, и он прекрасно работает, пока я нахожусь в режиме отладки или вызываю свой исполняемый файл напрямую. Модуль Nancy идеально подходит для просмотра бритвы.

Затем я устанавливаю приложение:

myapp.exe install

Когда я запускаю службу, кажется, что она работает нормально, ошибок нет. Затем, когда я захожу на http://localhost:8585/ в браузере, я получаю пустой ответ. Есть идеи, почему?

Прежде чем начать хостинг сервиса с помощью Topshelf, я запускаю Нэнси:

_nancyHost = new NancyHost(_baseUri);
_nancyHost.Start();

После этого служба верхнего уровня настраивается и запускается следующим образом:

using (Container)
{
    var host = HostFactory.New(config =>
    {
        config.EnableDashboard();
        config.AfterStartingServices(() => Console.WriteLine("Done starting..."));
        config.Service<EventHandlerService>(s =>
        {
            s.SetServiceName("EventHandlerService");
            s.ConstructUsing(c => Container.Get<EventHandlerService>());
            s.WhenStarted(n => StartService(n, stopwatch));
            s.WhenStopped(n => StopService(n, stopwatch));
        });
        config.RunAsLocalSystem();
        config.SetDescription("A service for processing events.");
        config.SetDisplayName("EventHandlerService");
        config.SetInstanceName("EventHandlerService");
        config.SetServiceName("EventHandlerService");
    });
    host.Run();
}

Я использую ninject, а методы StartService и StopService - это просто функции, которые печатают текущее значение stopwatch.ElapsedMilliseconds.

Вот конфигурация моего модуля Nancy:

Get["/"] = parameters =>
{
    var indexViewModel = new IndexViewModel { CurrentDateTime = DateTime.Now, WorkLog = _service.WorkLog };

    return View["index", indexViewModel];
};

Get["/js/{file}"] = p =>
{
    return Response.AsJs("scripts/" + p.file as String);
};

Get["/style/{file}"] = p =>
{
    return Response.AsCss("content/themes/base/" + p.file as String);
};

Get["/img/{file}"] = p =>
{
    return Response.AsImage("content/themes/base/images/" + p.file as String);
};

Я использую все значения по умолчанию в Нэнси, кроме частей Self Hosting & Razor. Есть идеи, что может происходить?

Я также попробовал netsh http add urlacl url=http://+:8585/ user=\Everyone, и это, похоже, не повлияло на поведение.

1 Ответ

8 голосов
/ 24 июня 2011

Я бы рискнул предположить, что это проблема корневого пути, поэтому он не может найти ваше представление (при условии, что представления копируются).Я понятия не имею, как работает TopShelf - устанавливает ли рабочий каталог каталог запускаемого приложения?По умолчанию корневой путь будет установлен на «Environment.CurrentDirectory», что может быть или не быть правильным.

Если использование CurrentDirectory нецелесообразно, то вы можете либо переключиться на встроенные представления (например, как это сделатьв основном решении) или добавьте реализацию IRootPathProvider в свой проект и вместо этого верните место сборки (оно автоматически подберет вашу версию по умолчанию)

...