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

MVC 6 install as a Windows Service (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 文件并在控制台 window 中获取站点 运行ning。伟大的!

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

有没有办法用 ASP.NET 5 MVC 6 网络应用程序做到这一点?

UPDATE: It seems like there is going to be a Windows Service hosting option coming in with RC2. See this GitHub comment for more info and .

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

I am hoping to get some blog posts and samples on this as I have been looking into this in terms of deployment. There is also an open discussion here: https://github.com/aspnet/Home/issues/465

您可以 运行 DNX 应用程序作为 Windows 服务,但是,您不能直接 运行 CMD 文件。您将收到以下错误消息:'The service did not respond to the start or control request in a timely fashion.' 您可以直接指向 dnx.exe 并将项目文件夹和命令作为参数传递。

阅读此 post 了解更多详情:http://taskmatics.com/blog/run-dnx-applications-windows-service/

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

中的 WebHostBuilder

最后,您可以通过将参数(例如 'non-service')传递给 Main 方法并在调用 ServiceBase.Run 之前进行检查,确保应用程序在 VS 中仍然 运行 可用,如果存在,您可以直接调用 OnStart。该项目的属性使您可以选择在 VS 中 运行ning 时传递参数。

更新:

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

值得一看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();
    }
}

从最新的 ASP.NET 核心版本 1.0.0 库开始,这已经有所简化。

ASP.NET GitHub page 上有关于此主题的公开讨论。

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

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

检查 project.json 文件以确保 "frameworks" 部分如下所示:

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

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

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

    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 repository.

上克隆并查看工作版本

希望对您有所帮助:)