使用OWIN将Web API作为Windows服务托管

时间:2015-02-15 14:48:06

标签: c# asp.net-web-api windows-services owin self-hosting

我尝试使用OWIN将Web API应用程序作为Windows服务运行。但是,在尝试启动服务时,我收到以下消息:

  

本地计算机上的[ServiceName]服务已启动,然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。

由于某些原因,我的服务并不了解它应该继续听http://localhost:9000

VS解决方案包含两个项目:Web API和Windows服务。

在Windows服务项目中,我有:

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

public partial class Service : ServiceBase
{
    private const string _baseAddress = "http://localhost:9000/";
    private IDisposable _server = null;

    public Service()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        _server = WebApp.Start<Startup>(url: _baseAddress);
    }

    protected override void OnStop()
    {
        if (_server != null)
        {
            _server.Dispose();
        }
        base.OnStop();
    }
}

OnStart 中, Startup 指的是Web API项目中的 Startup 类:

public class Startup
{
    public void Configuration(IAppBuilder builder)
    {
        var config = new HttpConfiguration();        
        config.Routes.MapHttpRoute("Default",
            "{controller}/{id}",
            new { id = RouteParameter.Optional });
        builder.UseWebApi(config);
    }
}

(它还包含Unity和日志记录的一些配置。)

我想Windows服务项目的安装程序部分大部分都是无关紧要的,但知道我有以下内容可能很有用:

this.serviceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalService;

我尝试过的事情:

  • 使用控制台应用程序托管Web API,然后将控制台应用程序作为Windows服务托管。但即使我包含了“Console.ReadKey()&#39;”,它也会停止。
  • 要遵循本指南: OWIN-WebAPI-Service 奇怪的是,我可以让他的服务工作,但当我尝试更改我的代码以匹配他的设置时,我不断得到同样的错误。

完整源代码: github.com/SabrinaMH/RoundTheClock-Backend/tree/exploring_hosting

1 个答案:

答案 0 :(得分:2)

对于该示例OWIN-WebAPI-Service,您必须安装Package

Install-Package Microsoft.Owin.Host.HttpListener