在没有Kestrel的情况下在IIS中托管ASP.NET Core

问题描述 投票:1回答:2

我们的托管部门不愿意允许运行Kestrel的ASP.NET核心托管,甚至不安装ASP.NET Core Server Hosting Bundle(AspNetCoreModule)。

在这种情况下是否有允许ASP.NET核心的替代方案?

环境:带有最新IIS和.NET 4.6.2的Windows Server 2012 R2。

它是一个共享托管环境,应用程序必须在IIS中运行。

iis asp.net-core
2个回答
2
投票

是的,您可以使用WebListener Web服务器而不是Kestrel。 WebListener仅适用于Windows平台,但由于这是您运行的地方,因此它是您的选择。

但是,WebListener不依赖IIS作为反向代理,实际上WebListener不能与IIS或IIS Express一起使用,因为它与ASP.NET核心模块不兼容。但它确实为您提供了一个非Kestrel选项,用于在Windows上托管ASP.NET Core。

你可以在这里了解更多信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/weblistener

在ASP.Net Core 2.2之前 如果您必须在IIS中托管并且您不想使用Kestrel并且您在Windows上运行,则没有选项。在Windows上,您可以使用不带IIS的WebListener进行托管,也可以使用IIS作为反向代理来托管Kestrel。这是目前Windows上唯一的两个选项。

更新:ASP.Net Core 2.2或更高版本从ASP.Net Core 2.2开始,现在支持在IIS中运行ASP.Net Core In Process。在这样的配置下,不使用Kestrel。要了解更多信息,请参阅Microsoft Docs站点或此博客文章In Process Hosting Model上的https://weblog.west-wind.com/posts/2019/Mar/16/ASPNET-Core-Hosting-on-IIS-with-ASPNET-Core-22


6
投票

实际上,您可以使用OWIN在工作进程中的IIS中运行ASP.NET Core(因此不使用ASP.NET核心模块)。

这是可能的,因为ASP.NET核心can be hosted on an OWIN server和IIS can be made an OWIN Server

看看下面的OWIN中间件,它展示了如何在IIS上运行ASP.NET Core。有关更完整的示例,请参阅此要点:https://gist.github.com/oliverhanappi/3720641004576c90407eb3803490d1ce

public class AspNetCoreOwinMiddleware<TAspNetCoreStartup> : OwinMiddleware, IServer
    where TAspNetCoreStartup : class
{
    private readonly IWebHost _webHost;
    private Func<IOwinContext, Task> _appFunc;

    IFeatureCollection IServer.Features { get; } = new FeatureCollection();

    public AspNetCoreOwinMiddleware(OwinMiddleware next, IAppBuilder app)
        : base(next)
    {
        var appProperties = new AppProperties(app.Properties);
        if (appProperties.OnAppDisposing != default(CancellationToken))
            appProperties.OnAppDisposing.Register(Dispose);

        _webHost = new WebHostBuilder()
            .ConfigureServices(s => s.AddSingleton<IServer>(this))
            .UseStartup<TAspNetCoreStartup>()
            .Build();

        _webHost.Start();
    }

    void IServer.Start<TContext>(IHttpApplication<TContext> application)
    {
        _appFunc = async owinContext =>
        {
            var features = new FeatureCollection(new OwinFeatureCollection(owinContext.Environment));

            var context = application.CreateContext(features);
            try
            {
                await application.ProcessRequestAsync(context);
                application.DisposeContext(context, null);
            }
            catch (Exception ex)
            {
                application.DisposeContext(context, ex);
                throw;
            }
        };
    }

    public override Task Invoke(IOwinContext context)
    {
        if (_appFunc == null)
            throw new InvalidOperationException("ASP.NET Core Web Host not started.");

        return _appFunc(context);
    }

    public void Dispose()
    {
        _webHost.Dispose();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.