web-dev-qa-db-ja.com

ホスティングサーバーがIISまたはKestrelが実行時にaspnetコアであるかどうかを確認します。

現在、Kestrel(ローカル)またはIIS InProcess(本番))のいずれかでアプリケーションを実行しています。

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

コントローラで実行時にホスティングサーバー名を取得できるようにしたいので、次のことを実現できます。

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

この特定のケースでは、Kestrelの応答ヘッダーで非ASCII文字がサポートされていないという事実を回避します。非ASCIIヘッダーを削除するのが理想的ですが、現在は従来の相互運用性のために必要です。

どんな助けでも大歓迎です。

9
Charlie

IIS InProcessでホストしている場合でも、プロセス名のチェックは機能しませんでしたが、dotnetプロセスにプロキシします(親を取得する必要があると思います) w3wpプロセスを取得するプロセス)。

NativeMethods.cs で内部的に.NET Coreが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;
    }
}
1
SoniCue

最も簡単な方法は、おそらくSystem.Diagnostics.Process.GetCurrentProcess().ProcessNameを読むことです。もしそれが w3wpまたはiisexpressはホストがIIS/IIS Expressであることを知っていますが、dotnet(または自己完結型デプロイメントを使用する場合は他の名前)はKestrelを示します。これは、インプロセス展開でのみ機能します。プロセス外の場合、これは機能しません。詳細は https://docs.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));
}
1
Lex Li

アプリケーションが起動すると、ホスティングメソッドをIApplicationBuilder.ServerFeatures。ここから、Kestrelとリバースプロキシの構成を参照するアイテムを見つけることができます。

Startup.Configureメソッドで使用できるIApplicationBuilderは、タイプIFeatureCollectionのServerFeaturesプロパティを公開します。 KestrelとHTTP.sysはそれぞれ1つの機能IServerAddressesFeatureのみを公開しますが、異なるサーバー実装は追加の機能を公開する場合があります。 IServerAddressesFeatureを使用して、サーバー実装が実行時にバインドしたポートを見つけることができます。

プロパティはコレクションであるため、IISリバースプロキシとケストレルに関連する特定のホスティングメソッドをフィルター処理する必要があります。

0
Greg