更新-2016年7月26日
在下面的答案中,我已经在ASP.NET Core 1.0.0
中添加了解决方案。
我已经创建了一个简单的MVC6应用程序,并包含了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 5MVC6Web应用来做到这一点呢?
发布于 2016-07-26 15:44:16
从最新的ASP.NET核心版本1.0.0库开始,这在某种程度上得到了简化。
在ASP.NET GitHub page上有一个关于这个话题的公开讨论。
所有的Windows应用程序现在都是控制台应用程序,并且有一个新的库可以作为ASP.NET服务托管在完整的.NET框架上(这是有意义的,因为整个问题都假设是一个Windows web服务器)。
我们需要创建一个新的ASP.NET Core Web Application (.NET Framework)
检查project.json
文件,确保"frameworks“部分如下:
"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 repository上克隆并查看工作版本。
我希望这能有所帮助:)
发布于 2015-08-14 21:32:19
您可以将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中运行时传递参数的选项。
更新:
在上面的基础上有一个后续的帖子。它展示了如何在ASP.NET服务中运行带有静态文件的MVC5和MVC6。链接在这里:http://taskmatics.com/blog/host-asp-net-in-a-windows-service/
发布于 2015-05-17 03:25:11
更新:它看起来像there is going to be a Windows Service hosting option coming in with RC2。有关详细信息和this answer,请参阅this GitHub comment。
恐怕这个问题的答案是否定的。我也一直在研究这一点,最好的方法是将您的项目部署到磁盘上的已知位置,并让Windows服务启动调用cmd文件的进程。这样,Windows服务将仅充当监视器。
我希望得到一些关于这方面的博客文章和样本,因为我一直在研究这方面的部署。这里还有一个公开的讨论:https://github.com/aspnet/Home/issues/465
https://stackoverflow.com/questions/30277991
复制相似问题