MVC 6作为Windows服务安装(ASP.NET Core 1.0.0)



更新-2016年7月26日

我已经在ASP.NET Core 1.0.0中的以下答案中添加了解决方案。


我创建了一个简单的MVC 6应用程序,并包含了Microsoft.AspNet.WebListener库,这样我就可以在IIS之外托管了。

来自project.json:

"dependencies": {
    "Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
    "Microsoft.AspNet.Mvc": "6.0.0-beta4"
},
"commands": {
    "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
}

当我发布这个时,我可以运行web.cmd文件,并在控制台窗口中运行网站。太棒了

但在OWIN中,您可以使用TopShelf从控制台应用程序启动web应用程序。然后可以将其构建为可执行文件并安装为Windows服务。

有没有一种方法可以用ASP.NET 5 MVC 6 web应用程序做到这一点?

您可以将DNX应用程序作为Windows服务运行,但不能直接运行CMD文件。您将收到一个错误,显示以下内容:"服务未及时响应启动或控制请求。"您可以直接指向dnx.exe并将项目文件夹和命令作为参数传递。

阅读这篇文章了解更多详细信息:http://taskmatics.com/blog/run-dnx-applications-windows-service/

设置好应用程序后。您可以从服务的OnStart方法引导ASP.NET。为此,您可以使用Microsoft.AspNet.Hosting.中的WebHostBuilder

最后,你可以通过向Main方法传递一个参数(如"non-service"(来确保应用程序在VS中仍然可以运行,并在调用ServiceBase.Run之前进行检查,如果存在,你可以直接调用OnStart。项目的属性为您提供了在VS.中运行时传递参数的选项

更新:

有一个后续的帖子,建立在上面的一个。它展示了如何在Windows服务中使用静态文件运行ASP.NET 5和MVC 6。链接在这里:http://taskmatics.com/blog/host-asp-net-in-a-windows-service/

从最新的ASP.NET Core 1.0.0版本库开始,这一过程现在有所简化。

ASP.NET GitHub页面上对此主题进行了公开讨论。

所有ASP.NET核心应用程序现在都是控制台应用程序,并且有一个新的库作为Windows服务托管,该服务在完整的.NET框架上运行(这是有道理的,因为整个问题假设是Windows web服务器(。

我们需要创建一个新的ASP.NET Core Web Application (.NET Framework)

检查project.json文件以确保"框架"部分如下:

"frameworks": {
    "net461": {}
},

然后,我们需要添加服务托管库Microsoft.AspNetCore.Hosting.WindowsServices并保存project.json以恢复包。

然后,我们需要编辑program.cs文件,并添加在调试中运行和作为服务运行的路径,其代码如下:

    public static void Main(string[] args)
    {
        var isDebug = Debugger.IsAttached || ((IList)args).Contains("--debug");
        string runPath;
        if (isDebug)
            runPath = Directory.GetCurrentDirectory();
        else
        {
            var exePath = Process.GetCurrentProcess().MainModule.FileName;
            runPath = Path.GetDirectoryName(exePath);
        }
        var host = new WebHostBuilder()
                        .UseKestrel()
                        .UseContentRoot(runPath)
                        .UseStartup<Startup>()
                        .Build();
        if (isDebug)
            host.Run();
        else
            host.RunAsService();
    }

.RunAsService()方法是由Microsoft.AspNetCore.Hosting.WindowsServices库提供的扩展方法。

要作为服务安装,您只需要在管理员命令提示符下运行以下命令:

SC Create <service-name> binPath= "[PublishOutputPath]mvc6-example.exe"

请在我的GitHub存储库中克隆并查看工作版本。

我希望这能有所帮助:(

最新消息:看起来RC2将提供一个Windows服务托管选项。请参阅此GitHub评论以了解更多信息和此答案。

恐怕答案是否定的。我也一直在研究这个问题,最好的方法是将你的项目部署到磁盘上的一个已知位置,并使用Windows服务来启动调用cmd文件的进程。通过这种方式,Windows服务将只起到看门狗的作用。

我希望能得到一些关于这方面的博客文章和示例,因为我一直在研究部署方面的问题。这里还有一个公开讨论:https://github.com/aspnet/Home/issues/465

值得一看https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNet.Hosting.WindowsServices

ASP.NET团队似乎正在致力于为在Windows服务中托管ASP.NET MVC 6应用程序提供本机支持。

以下是一个简单的ServiceBase托管ASP.NET MVC 6应用程序:

/// <summary>
///     Provides an implementation of a Windows service that hosts ASP.NET.
/// </summary>
public class WebApplicationService : ServiceBase
{
    private IWebApplication _application;
    private IDisposable _applicationShutdown;
    private bool _stopRequestedByWindows;
    /// <summary>
    /// Creates an instance of <c>WebApplicationService</c> which hosts the specified web application.
    /// </summary>
    /// <param name="application">The web application to host in the Windows service.</param>
    public WebApplicationService(IWebApplication application)
    {
        _application = application;
    }
    protected sealed override void OnStart(string[] args)
    {
        OnStarting(args);
        _application
            .Services
            .GetRequiredService<IApplicationLifetime>()
            .ApplicationStopped
            .Register(() =>
            {
                if (!_stopRequestedByWindows)
                {
                    Stop();
                }
            });
        _applicationShutdown = _application.Start();
        OnStarted();
    }
    protected sealed override void OnStop()
    {
        _stopRequestedByWindows = true;
        OnStopping();
        _applicationShutdown?.Dispose();
        OnStopped();
    }
}

相关内容

  • 没有找到相关文章

最新更新