Asp.Net vNext 在现有应用程序中自托管
Asp.Net vNext self-hosting within existing application
我一直在寻找这个问题的答案,无论是在 SO 还是其他方面,但到目前为止我还没有看到任何答案。
我们正在考虑向现有 Windows 服务/WPF EXE 添加一些报告。理想情况下,我们会自行托管一个小的 vNext 应用程序,该应用程序会公开我们的应用程序可以使用的报告端点。这可以通过 OWIN 和 ASP.NET 4.
这甚至可以用 vNext 实现吗?
我已经尝试了一些示例等,很明显,K 运行时似乎是与 CLR 不同的运行时。构建等也完全不同......所以我想至少它必须是一个完全独立的过程......或者我是不是找错了树?
特别是我们似乎需要调用 K 运行时(k web 或 k pack'ed .cmd),这看起来更直观,因为我已经在进程中 运行(主要 exe/service).
编辑:我想知道答案是否是 NoWin ,引用并提供了 OWIN 容器。但是我正在努力看看这是否是最好的方法...
好吧,我在 jabbr.net 上花了一些时间,并得到了很棒的@dfowl 的一些帮助,还有一个很有帮助但相当简短的年轻开发人员(那些日子)。
@dfowl:那个场景几乎已经死了
我认为 - 因为我们的 Windows Service/WPF 在 CLR 下运行,而 vNext 在 CLR 下运行,它们是不同的运行时。
有一种方法可以做到这一点,它基于旧版本的 K 运行时,而且很麻烦。可能会归档,但绝不会投入生产:
这里有一个可能的解决方案:How to Run DNX Applications in a Windows Service 和
How to Host ASP.NET in a Windows Service 感谢 Erez Testiler。
基本上思路是添加以下引用:
- "Microsoft.AspNet.Hosting": "1.0.0-beta7" – 引导网络服务器
- "Microsoft.AspNet.Server.Kestrel": "1.0.0-beta7" – Web 服务器实现
- "Microsoft.AspNet.StaticFiles": "1.0.0-beta7" – 托管静态文件
- "Microsoft.AspNet.Mvc": "6.0.0-beta7" – 包括所有 MVC 包
然后以编程方式配置并启动服务器 ASP.NET:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Hosting.Internal;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.Configuration.Memory;
using Microsoft.Framework.DependencyInjection;
using System;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
....
private readonly IServiceProvider _serviceProvider;
private IHostingEngine _hostingEngine;
private IDisposable _shutdownServerDisposable;
public Program(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
protected override void OnStart(string[] args)
{
var configSource = new MemoryConfigurationSource();
configSource.Add("server.urls", "http://localhost:5000");
var config = new ConfigurationBuilder(configSource).Build();
var builder = new WebHostBuilder(_serviceProvider, config);
builder.UseServer("Microsoft.AspNet.Server.Kestrel");
builder.UseServices(services => services.AddMvc());
builder.UseStartup(appBuilder =>
{
appBuilder.UseDefaultFiles();
appBuilder.UseStaticFiles();
appBuilder.UseMvc();
});
_hostingEngine = builder.Build();
_shutdownServerDisposable = _hostingEngine.Start();
}
这对我来说似乎是一个很好的解决方案。
我一直在寻找这个问题的答案,无论是在 SO 还是其他方面,但到目前为止我还没有看到任何答案。
我们正在考虑向现有 Windows 服务/WPF EXE 添加一些报告。理想情况下,我们会自行托管一个小的 vNext 应用程序,该应用程序会公开我们的应用程序可以使用的报告端点。这可以通过 OWIN 和 ASP.NET 4.
这甚至可以用 vNext 实现吗?
我已经尝试了一些示例等,很明显,K 运行时似乎是与 CLR 不同的运行时。构建等也完全不同......所以我想至少它必须是一个完全独立的过程......或者我是不是找错了树?
特别是我们似乎需要调用 K 运行时(k web 或 k pack'ed .cmd),这看起来更直观,因为我已经在进程中 运行(主要 exe/service).
编辑:我想知道答案是否是 NoWin ,引用并提供了 OWIN 容器。但是我正在努力看看这是否是最好的方法...
好吧,我在 jabbr.net 上花了一些时间,并得到了很棒的@dfowl 的一些帮助,还有一个很有帮助但相当简短的年轻开发人员(那些日子)。
@dfowl:那个场景几乎已经死了
我认为 - 因为我们的 Windows Service/WPF 在 CLR 下运行,而 vNext 在 CLR 下运行,它们是不同的运行时。
有一种方法可以做到这一点,它基于旧版本的 K 运行时,而且很麻烦。可能会归档,但绝不会投入生产:
这里有一个可能的解决方案:How to Run DNX Applications in a Windows Service 和 How to Host ASP.NET in a Windows Service 感谢 Erez Testiler。
基本上思路是添加以下引用:
- "Microsoft.AspNet.Hosting": "1.0.0-beta7" – 引导网络服务器
- "Microsoft.AspNet.Server.Kestrel": "1.0.0-beta7" – Web 服务器实现
- "Microsoft.AspNet.StaticFiles": "1.0.0-beta7" – 托管静态文件
- "Microsoft.AspNet.Mvc": "6.0.0-beta7" – 包括所有 MVC 包
然后以编程方式配置并启动服务器 ASP.NET:
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Hosting.Internal;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.Configuration.Memory;
using Microsoft.Framework.DependencyInjection;
using System;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
....
private readonly IServiceProvider _serviceProvider;
private IHostingEngine _hostingEngine;
private IDisposable _shutdownServerDisposable;
public Program(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
protected override void OnStart(string[] args)
{
var configSource = new MemoryConfigurationSource();
configSource.Add("server.urls", "http://localhost:5000");
var config = new ConfigurationBuilder(configSource).Build();
var builder = new WebHostBuilder(_serviceProvider, config);
builder.UseServer("Microsoft.AspNet.Server.Kestrel");
builder.UseServices(services => services.AddMvc());
builder.UseStartup(appBuilder =>
{
appBuilder.UseDefaultFiles();
appBuilder.UseStaticFiles();
appBuilder.UseMvc();
});
_hostingEngine = builder.Build();
_shutdownServerDisposable = _hostingEngine.Start();
}
这对我来说似乎是一个很好的解决方案。