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

Posted

技术标签:

【中文标题】使用 OWIN 将 Web API 托管为 Windows 服务【英文标题】:Host Web API as Windows Service using OWIN 【发布时间】:2015-04-16 03:03:39 【问题描述】:

我正在尝试使用 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()”,它也只是停止了。 要遵循本指南: OWIN-WebAPI-Service 奇怪的是我可以让他的服务正常工作,但是当我尝试更改我的代码以匹配他的设置时,我一直收到同样的错误。

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

【问题讨论】:

我的行为几乎完全相同。你找到解决办法了吗? 不,很遗憾没有。如果您找到解决方案,请告诉我。我在另一个项目中偶然发现了相同的服务消息,这与 OWIN 无关。在那里,解决方案是确保服务项目中的配置文件包含与应用程序项目本身相同的信息(因为 Windows 服务项目在它自己的项目中使用了配置文件)。但我还没有尝试解决这个问题。 我发现这篇文章很有用:***.com/questions/4864673/… 谢谢!我去看看:) 你检查了这个链接吗? piotrwalat.net/hosting-web-api-in-windows-service 【参考方案1】:

当您得到“本地计算机上的服务启动然后停止”时,通常意味着启动服务时存在未捕获的异常。查看Windows service on Local Computer started and then stopped error,了解查找该异常的提示。

根据您的描述,我猜这个问题是由另一个项目中存在的启动类引起的,您是否尝试过在窗口服务项目中包含启动类?

此外,来自 H*** (https://github.com/danesparza/OWIN-WebAPI-Service) 的链接显示了一种从不同项目加载控制器或将程序集动态解析到当前 AppDomain 的变通方法。我想这也值得一试。

希望这会有所帮助。

【讨论】:

【参考方案2】:

对于那个例子OWIN-WebAPI-Service,你必须安装包

Install-Package Microsoft.Owin.Host.HttpListener

【讨论】:

以上是关于使用 OWIN 将 Web API 托管为 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

OWIN 托管的 web api:使用 windows 身份验证并允许匿名访问

在 DELETE 上不允许使用 Owin 自托管 Web API 405 方法

在使用 Owin 自托管的 Web API 中获取远程主机 IP

asp.net web api 自托管 / owin / katana

具有 OWIN 自托管的 Web API 无类型 OData 服务返回 406 Not Acceptable

如何使用Owin和Web Api 2在SignalR上配置MessagePack?