5

我正在尝试在 Topshelf 服务中使用 Nancy(使用带有 Razor 视图的自托管 nuget 包)。我将它托管在http://localhost:8585/上,当我处于调试模式或直接调用我的可执行文件时它工作得很好。南希模块完美地提供了一个剃刀视图。

然后我安装应用程序:

myapp.exe install

当我启动服务时,它似乎工作得很好,并且没有错误。然后,当我在浏览器中访问http://localhost:8585/时,我得到一个空白响应。关于为什么的任何想法?

在开始使用 Topshelf 托管服务之前,我启动了 Nancy:

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

之后,topshelf 服务就这样配置和启动了:

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 部分,我使用了 Nancy 中的所有默认设置。知道会发生什么吗?

我也尝试过netsh http add urlacl url=http://+:8585/ user=\Everyone,它似乎对行为没有任何影响。

4

1 回答 1

8

我冒险猜测它是根路径问题,因此它找不到您的视图(假设正在复制视图)。我不知道 TopShelf 是如何工作的——它是否将工作目录设置为它正在启动的应用程序的目录?默认情况下,根路径将设置为“Environment.CurrentDirectory”,这可能正确也可能不正确。

如果使用 CurrentDirectory 不可行,那么您可以切换到嵌入式视图(有关如何在主解决方案中执行此操作的示例),或者将 IRootPathProvider 的实现添加到您的项目并返回程序集位置(它会自动获取您的版本超过默认值)

于 2011-06-24T14:33:42.697 回答