检查Asp.Net(Core)应用程序是否托管在IIS中

12

如何在应用程序中检查它是否正在IIS上托管?


你可以检查服务器实现类型,查看我在这里对类似问题的回答:https://dev59.com/1VMI5IYBdhLWcg3wlMdZ#77009987 - sich
3个回答

10

1
自从Asp.Net Core 6以来,“APP_POOL_ID”变量似乎不再可用。我现在使用“ASPNETCORE_IIS_PHYSICAL_PATH”环境变量作为替代方案。 - Olivier Leneveu
1
我无法相信他们改变了这个……我建议你开始使用Linux,卸载任何微软软件并销毁所有可能拥有的Windows服务器。微软是一种恶性存在,.NET就是个笑话…… - Branimir Ričko
说正经的,我很高兴你找到了一个替代的环境变量 :) - Branimir Ričko

1

我尝试了Branimir Ričko的答案,但发现它不正确:在IIS Express下运行时也会设置这个环境变量。

因此这是我的修改版本:

static bool IsRunningInsideIIS() =>
    System.Environment.GetEnvironmentVariable("ASPNETCORE_HOSTINGSTARTUPASSEMBLIES") is string startupAssemblies &&  
 startupAssemblies.Contains(typeof(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults).Namespace);

0

我相信没有直接的方法可以开箱即用地实现这一点。至少我没有找到一个。原因是ASP.NET Core应用程序实际上是一个自包含的应用程序,除非后者透露有关自身的信息,否则它不知道其父上下文。

例如,在配置文件中,我们可以告诉自己正在运行哪种类型的安装:productiondevelopment。我们可以假设productionIIS,而development不是。然而,这对我来说并没有起作用。因为我的生产设置可以是IISwindows service

所以,我通过根据运行类型提供不同的命令行参数来解决了这个问题。实际上,这对我来说很自然,因为windows service确实需要不同的运行方式。

例如,在我的情况下,代码看起来有些像这样:

namespace AspNetCore.Web.App
{
    using McMaster.Extensions.CommandLineUtils;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Hosting.WindowsServices;
    using System;
    using System.Diagnostics;
    using System.IO;

    public class Program
    {
        #region Public Methods

        public static IWebHostBuilder GetHostBuilder(string[] args, int port) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseIISIntegration()
                .UseUrls($"http://*:{port}")
                .UseStartup<Startup>();

        public static void Main(string[] args)
        {
            var app = new CommandLineApplication();

            app.HelpOption();
            var optionHosting = app.Option("--hosting <TYPE>", "Type of the hosting used. Valid options: `service` and `console`, `console` is the default one", CommandOptionType.SingleValue);
            var optionPort = app.Option("--port <NUMBER>", "Post will be used, `5000` is the default one", CommandOptionType.SingleValue);

            app.OnExecute(() =>
            {
                //
                var hosting = optionHosting.HasValue()
                    ? optionHosting.Value()
                    : "console";

                var port = optionPort.HasValue()
                    ? new Func<int>(() =>
                    {
                        if (int.TryParse(optionPort.Value(), out var number))
                        {
                            // Returning successfully parsed number
                            return number;
                        }

                        // Returning default port number in case of failure
                        return 5000;
                    })()
                    : 5000;

                var builder = GetHostBuilder(args, port);

                if (Debugger.IsAttached || hosting.ToLowerInvariant() != "service")
                {
                    builder
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .Build()
                        .Run();
                }
                else
                {
                    builder
                        .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
                        .Build()
                        .RunAsService();
                }
            });

            app.Execute(args);
        }

        #endregion Public Methods
    }
}

这段代码不仅允许选择托管类型(serviceconsole——这是IIS应该使用的选项),还允许更改端口,这在作为Windows服务运行时非常重要。

另一个好处是使用参数解析库McMaster.Extensions.CommandLineUtils——它将显示有关配置的命令行开关的信息,因此很容易选择正确的值。


对不起,当我执行RunAsService时,应用程序不会执行...我需要创建一个工作线程吗? - advapi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接