簡體   English   中英

在 aspnet core 運行時檢查托管服務器是 IIS 還是 Kestrel

[英]Check if hosting server is IIS or Kestrel at runtime in aspnet core

我目前正在 Kestrel(本地)或 IIS InProcess(生產)下運行我的應用程序。

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

我希望能夠在運行時在控制器中獲取托管服務器名稱,以便實現以下目標:

if (hostingServer == "kestrel")
{
    DoSomething();
}
else
{
    DoSomethingElse();
}

在這種特定情況下,它是為了解決這樣一個事實,即 Kestrel 的響應標頭中不支持非 ascii 字符。 理想情況下,我會刪除非 ascii 標頭,但目前它是遺留互操作性所必需的。

任何幫助將不勝感激。

最簡單的方法可能是閱讀System.Diagnostics.Process.GetCurrentProcess().ProcessName 如果它是w3wpiisexpress ,則您知道主機是 IIS/IIS Express,而dotnet (或其他名稱,當您使用獨立部署時)表示 Kestrel。 這僅適用於進程中的部署。 如果您不在流程中,這將不起作用。 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module了解更多信息

例子:

/// <summary>
/// Check if this process is running on Windows in an in process instance in IIS
/// </summary>
/// <returns>True if Windows and in an in process instance on IIS, false otherwise</returns>
public static bool IsRunningInProcessIIS()
{
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        return false;
    }

    string processName = Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().ProcessName);
    return (processName.Contains("w3wp", StringComparison.OrdinalIgnoreCase) ||
        processName.Contains("iisexpress", StringComparison.OrdinalIgnoreCase));
}

檢查進程名稱對我不起作用,即使在 IIS 中使用 InProcess 托管時它仍然代理dotnet進程(我的猜測是您需要獲取父進程才能獲取 w3wp 進程)。

.NET Core 在內部調用NativeMethods.cs中的IsAspNetCoreModuleLoaded() ,這可以在WebHostBuilderIISExtensions.cs中找到。 因此可以使用以下代碼檢查 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;
    }
}

當應用程序啟動時,可以在IApplicationBuilder.ServerFeatures中公開托管方法。 通過此處,您可以找到引用 Kestrel 與反向代理配置的項目。

Startup.Configure 方法中可用的 IApplicationBuilder 公開 IFeatureCollection 類型的 ServerFeatures 屬性。 Kestrel 和 HTTP.sys 僅公開一個功能,即 IServerAddressesFeature,但不同的服務器實現可能會公開其他功能。 IServerAddressesFeature 可用於找出服務器實現在運行時綁定了哪個端口。

該屬性是一個集合,因此您需要篩選與 IIS 反向代理和 Kestrel 相關的特定托管方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM