Asp.Net vNext在现有应用程序中自托管

时间:2015-01-14 09:24:30

标签: c# self-hosting asp.net-core

我一直在寻找这个问题的答案,但是到目前为止我还没有看到任何答案。

我们正在考虑向现有的Windows Services / WPF EXE添加一些报告。理想情况下,我们会自行托管一个小的vNext应用程序,该应用程序将公开我们的应用程序可以使用的报告端点。这可以通过OWIN和ASP.NET 4实现。

vNext甚至可以实现这一点吗?

我已经尝试了一些样本等,而K Runtime似乎显然是与CLR不同的运行时。构建等也是完全不同的...所以我想至少它必须是一个完全独立的过程....或者我是在咆哮错误的树?

特别是我们似乎需要调用K运行时(k web或elsed ak pack'ed .cmd),因为我已经在我正在运行的进程(主要的exe / service)中,这似乎更直观。

编辑:我想知道答案是NoWin,引用并提供OWIN容器。我正在努力想知道这是不是最好的方法......

2 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案: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” - 引导Web服务器
  • “Microsoft.AspNet.Server.Kestrel”:“1.0.0-beta7” - Web服务器实现
  • “Microsoft.AspNet.StaticFiles”:“1.0.0-beta7” - 托管静态文件
  • “Microsoft.AspNet.Mvc”:“6.0.0-beta7” - 包含所有MVC包

然后以编程方式配置并启动Server和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();
}

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

答案 1 :(得分:0)

好的,我在jabbr.net上度过了一段时间,并从一个非常棒的@dfowl那里得到了一些帮助,还有一个很有帮助的,如果是相当简洁的年轻人(那些日子)。

@dfowl:那个场景已经死了

我认为我们的Windows服务/ WPF在CLR下运行,vNext在CLR下运行,它们是不同的运行时。

基于旧版本的K运行时, 是一种方法,而且它是毛茸茸的。文件可能,但从未投入生产:

Alxandr's CLR Bootstrap for K runtime