在运行时检查托管服务器是IIS还是Kestrel在ASPNET Core中

时间:2019-04-25 15:27:44

标签: c# iis asp.net-core .net-core kestrel-http-server

我目前正在Kestrel(本地)或IIS InProcess(生产)下运行我的应用程序。

tuple

我希望能够在运行时在控制器中获取托管服务器的名称,以便实现以下目标:

return WebHost.CreateDefaultBuilder(args)
    .ConfigureKestrel(options => options.AddServerHeader = false)
    .UseIIS()
    .UseStartup<Startup>();

在这种特定情况下,可以避免以下事实:Kestrel的响应标头中不支持非ascii字符。理想情况下,我将删除non-ascii标头,但目前它是旧版互操作性所必需的。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

检查进程名称对我来说不起作用,即使使用InProcess在IIS中托管它仍然仍然是dotnet进程的代理(我的猜测是,您需要获得父进程才能获得w3wp进程)

NativeMethods.cs中可以找到,内部.NET Core在WebHostBuilderIISExtensions.cs中调用IsAspNetCoreModuleLoaded()。因此,可以使用以下代码检查IIS。

internal static class NativeMethods
{
    internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    public static bool IsAspNetCoreModuleLoaded()
    {
        return GetModuleHandle(AspNetCoreModuleDll) != IntPtr.Zero;
    }
}

答案 1 :(得分:0)

应用程序启动时,可以在IApplicationBuilder.ServerFeatures中公开托管方法。在这里,您可以找到引用Kestrel与反向代理配置的项目。

  

Startup.Configure方法中可用的IApplicationBuilder   公开IFeatureCollection类型的ServerFeatures属性。   Kestrel和HTTP.sys各自仅公开一个功能,   IServerAddressesFeature,但不同的服务器实现可能   公开其他功能。可以使用IServerAddressesFeature   找出服务器实现在运行时绑定到的端口。

该属性是一个集合,因此您需要过滤与IIS反向代理和Kestrel相关的特定托管方法。

答案 2 :(得分:0)

最简单的方法可能是读取System.Diagnostics.Process.GetCurrentProcess().ProcessName。如果它是w3wpiisexpress,则您知道主机是IIS / IIS Express,而dotnet(或使用自包含部署的其他名称)则表示Kestrel。

应该有其他选择。