更新-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();
}
}