我们的托管部门不愿意允许运行Kestrel的ASP.NET核心托管,甚至不安装ASP.NET Core Server Hosting Bundle(AspNetCoreModule)。
在这种情况下是否有允许ASP.NET核心的替代方案?
环境:带有最新IIS和.NET 4.6.2的Windows Server 2012 R2。
它是一个共享托管环境,应用程序必须在IIS中运行。
是的,您可以使用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
实际上,您可以使用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();
}
}