我目前正在Kestrel(本地)或IIS InProcess(生产)下运行我的应用程序。
tuple
我希望能够在运行时在控制器中获取托管服务器的名称,以便实现以下目标:
return WebHost.CreateDefaultBuilder(args)
.ConfigureKestrel(options => options.AddServerHeader = false)
.UseIIS()
.UseStartup<Startup>();
在这种特定情况下,可以避免以下事实:Kestrel的响应标头中不支持非ascii字符。理想情况下,我将删除non-ascii标头,但目前它是旧版互操作性所必需的。
任何帮助将不胜感激。
答案 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
。如果它是w3wp
或iisexpress
,则您知道主机是IIS / IIS Express,而dotnet
(或使用自包含部署的其他名称)则表示Kestrel。
应该有其他选择。