我如何知道我的应用程序是在 Kestrel 还是 HTTP.sys 下运行?

Mik*_*MVP 5 asp.net-mvc http.sys kestrel-http-server asp.net-core

了解我的应用程序是在 Kestrel 还是 HTTP.sys 下运行的最佳方法是什么。到目前为止,我所发现的只是检查 HttpConext 属性类名称之一中是否有“Kestrel”。

在 MVC 控制器中我可以执行以下操作:

Boolean IsKestrel = HttpContext.Features.GetType().ToString().Contains("Kestrel");
Run Code Online (Sandbox Code Playgroud)

即检查这个:

Features = {Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection<Microsoft.AspNetCore.Hosting.HostingApplication.Context>}
Run Code Online (Sandbox Code Playgroud)

使用 HTTP.sys 时我只得到:

Features = {Microsoft.AspNetCore.Http.Features.FeatureCollection}
Run Code Online (Sandbox Code Playgroud)

(这里的“Http”足以知道这是HTTP.sys吗?)

一定会有更好的办法。是否有一个明显的属性包含正在使用的主机的名称?

更广泛的问题可能是,我如何知道构建器模式构建了什么?

更新

找到了更好的东西,但仍在寻找具有服务器名称或类型的属性。

在 MVC 控制器中:

var isKestrel = HttpContext.Request.Headers.GetType().ToString().Contains(".Kestrel.");
var isHTTPsys = HttpContext.Request.Headers.GetType().ToString().Contains(".HttpSys.");
Run Code Online (Sandbox Code Playgroud)

Pet*_*art 5

在操作系统级别,netsh http show servicestate将列出通过 HTTP.SYS 侦听的所有活动 URL。

在 netcore 6 中,您可以从代码中找到一个实例Microsoft.AspNetCore.Hosting.Server.IServer并检查其实现:

  • 红隼=>Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl
  • IIS ==>Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer
  • HTTP.SYS =>Microsoft.AspNetCore.Server.HttpSys.MessagePump

这依赖于实现细节(因此可能会中断),其他扩展也可以更改这些细节,例如 CoreWcf 创建CoreWCF.Configuration.WrappingIServer包装上述实现之一。


jac*_*ack 0

您可以使用System.Diagnostics.Process.GetCurrentProcess().ProcessName

  • 这仅告诉我我是否在 IIS(例如 IISExpress)或我的 .NET Core 应用程序的名称(“MyTestWebApp”)后面运行。我正在寻找 Kestrel 与 HTTP.sys。 (2认同)