[英]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
。 如果它是w3wp
或iisexpress
,則您知道主機是 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.