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 运行时,而且很麻烦。可能会归档,但绝不会投入生产:

Alxandr's CLR Bootstrap for K runtime

这里有一个可能的解决方案:How to Run DNX Applications in a Windows ServiceHow 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();
}

这对我来说似乎是一个很好的解决方案。