5

Topshelf サービス内で (Razor ビューの nuget パッケージを使用したセルフ ホスティングを使用して) Nancy を使用しようとしています。私はそれをhttp://localhost:8585/でホストしていますが、デバッグモードにいる間、または実行可能ファイルを直接呼び出している間は問題なく動作します。Nancy モジュールは、カミソリ ビューを完全に提供します。

次に、アプリケーションをインストールします。

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 に答える