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

JDT*_*LH9 17 asp.net-core-mvc dnx asp.net-core

更新 - 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"
}
Run Code Online (Sandbox Code Playgroud)

当我发布这个时,我可以运行web.cmd文件并在控制台窗口中运行该站点.大!

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

有没有办法使用ASP.NET 5 MVC 6 Web应用程序执行此操作?

Ere*_*z T 10

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

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

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

最后,您可以通过将参数(例如"非服务")传递给Main方法并在调用ServiceBase.Run之前检查该应用程序,确保应用程序仍可在VS中运行,如果存在,则可以直接调用OnStart.项目的属性为您提供了在VS中运行时传递参数的选项.

更新:

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


JDT*_*LH9 6

从最新的ASP.NET Core Version 1.0.0库开始,现在有些简化了.

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

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

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

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

"frameworks": {
    "net461": {}
},
Run Code Online (Sandbox Code Playgroud)

我们需要添加服务托管库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();
    }
Run Code Online (Sandbox Code Playgroud)

.RunAsService()方法是Microsoft.AspNetCore.Hosting.WindowsServiceslib 提供的扩展方法.

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

SC Create <service-name> binPath= "[PublishOutputPath]\mvc6-example.exe"
Run Code Online (Sandbox Code Playgroud)

请克隆并查看我的GitHub存储库上的工作版本.

我希望这有帮助 :)


tug*_*erk 5

更新:似乎将有一个Windows服务托管选项进入RC2.有关更多信息和此答案,请参阅此GitHub评论.

我担心答案是否定的.我一直在研究这个问题,最好的方法是将项目部署到磁盘上的已知位置,并使用Windows服务来启动调用cmd文件的进程.这样,Windows服务只会充当监视器.

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