【问题标题】:Hosting ASP.NET Core in IIS without Kestrel在没有 Kestrel 的 IIS 中托管 ASP.NET Core
【发布时间】:2017-07-19 12:49:45
【问题描述】:

我们的托管部门不愿意允许运行 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


    【解决方案1】:

    是的,您可以使用 WebListener Web 服务器来代替 Kestrel。 WebListener 仅适用于 Windows 平台,但由于您正在运行它,因此它是您的一个选项。

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

    您可以在这里了解更多信息: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 CoreIn 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

    【讨论】:

    • 看起来 OP 希望将其核心应用程序部署为共享托管环境中的 Web 应用程序。他们无法控制 Web 服务器。他们不能只部署一个将自身绑定到端口 80 的控制台应用程序。
    • 是的 CodeCaster 是对的,我错过了这个信息,但它必须包含在 IIS 共享主机中
    • 请看下面的答案。
    • @DanielLeach 谢谢丹尼尔。当我写下我的原始答案时,我不相信这是一个选择,但今天这个答案比我的要好得多,我个人对此表示赞同。
    • 如果有人想知道“WebListener”是什么:它是“Http.sys”的旧名称。 docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…
    【解决方案2】:

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

    这是可能的,因为 ASP.NET Core 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();
        }
    }
    

    【讨论】:

    • 我已经成功地做到了这一点,但是我确实需要将 content-type 设置为 "" 以便 AspNetCore 不会感到困惑并返回一个带有 text/html 的 406 owin 实现默认为。
    • 这对于一个 hello world 来说没问题,但是当我尝试在更复杂的场景中使用时遇到了一些问题。
    • @TóthTibor:你是对的。这不是一个完整的示例,如果您有其他选项(例如使用 Kestrel 或 WebListener/http.sys 运行受支持的方式),也不应该使用它。
    猜你喜欢
    • 2018-12-10
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多