简体   繁体   中英

Windows service with Nancy does not start host

I have developed a Windows Service whose task is actually to start a host with particular url and port . Below is what I have now.

Program.cs

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
         new WindowsDxService() 
    };
    ServiceBase.Run(ServicesToRun);
}

ProjectInstaller.cs

[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
    public ProjectInstaller()
    {
        InitializeComponent();
    }
}

WindowsDxService.cs

public partial class WindowsDxService : ServiceBase
{
    public WindowsDxService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        var url = "http://127.0.0.1:9000";
        using (var host = new NancyHost(new Uri(url)))
        {
            host.Start();
        }
    }
}

Configuration on serviceProcessInstaller1 and serviceInstaller1 in ProjectInstaller.cs [Design] file.

serviceProcessInstaller1
     Account=LocalSystem

serviceInstaller1
     StartType=Automatic

Library.cs

public class Library : NancyModule
{
     public Library()
     {
         Get["/"] = parameters =>
         {
             return "Hello world";
         };
         Get["jsontest"] = parameters =>
         {
             var test = new
             {
                 Name = "Guruprasad Rao",
                 Twitter="@kshkrao3",
                 Occupation="Software Developer"
             };
             return Response.AsJson(test);
         };
     }
}

Basically I followed this tutorial which actually shows how to do it with Console application which I succeeded though, but I wanted to have this as Windows Service which actually starts a host with specified port whenever the system starts. The service is started successfully and running but whenever I browse the url in the same system its not showing up the page, which means our basic This webpage is not available message. What else configuration I have to do so as to start the host ? Hoping for a help.

You are disposing the host when you start your service. I would suggest something like this:

public partial class WindowsDxService : ServiceBase
{
    private Host host;

    public WindowsDxService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        this.host = new NancyHost(...)
        this.host.Start();
    }

    protected override void OnStop()
    {
        this.host.Stop();
        this.host.Dispose();
    }
}

You'd probably find it a lot easier to write the service if you used TopShelf library.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM