Title差不多就是这样。具有不同的逻辑的 DLL,具体取决于这是网站还是其他应用类型。在框架中,我们经常使用HttpContext.Current
.我们也可以从中检索请求。我查看了不同的文档,例如RuntimeInformation
,System.Runtime.Hosting
等。
有没有适当的方法来确定这一点?
没有标准的方法可以检测您的dll是否在网站中运行,首先,即使是.NET Framework也从来没有一个。
由于您必须做出使用它的假设,您基于HttpContext.Current
的方法非常有限,并且从来没有应该允许对支持网站的过程进行通用检测。
首先,您对问题"检测dll是否在网站或其他应用程序中运行"的定义似乎太宽泛了。如果您想确定您的 dll 是否在网站中运行,您必须提前知道测试的"网站"中将出现哪些 dll。完全可以想象,网站可以基于私有Web框架创建,这些框架跳过所有标准 ASP.Net 核心组件甚至.NET Core网络库,但可以使用您的程序集,而不是没有简单的方法来检测它是否在网站中运行。例如,可以基于英特尔 DPDK 用户空间 IO 库创建非常快速的 .NET Core 网站。为了更好地理解这个问题,请访问techpowerup基准测试,并检查每种编程语言存在多少种不同的低级和高级Web框架和堆栈,或者为不同的虚拟机及时编译的语言。目前,.NET Core是一个独特的示例,其Web框架和堆栈数量非常有限。
也许,说明问题的正确方法是:"检测 dll 是否在 Core 框架中运行 ASP.Net",或者即使 dll 是否在使用 ASP.Net Core 程序集和 .NET Core 网络堆栈的进程中运行。而且,除了将检测范围限制在可处理的问题大小之外,由您决定检查请求处理管道的哪些部分,以确认 dll 正在一个可以描述为具有网站功能的进程中运行。您可能知道 ASP.Net 核心处理管道是可扩展的,并且可以由任何用户进行大量自定义,这可能会使上述方法无用(在.NET Framework中,此语句也成立)。
否则,尝试找到"通用"解决方案,您可能会决定采用非常通用的方法来检测网站进程,但很可能需要在操作系统级别进行非常低级别的验证。您可以检查运行 dll 的进程是否正在使用内核甚至用户空间网络堆栈(再次作为英特尔 DPDK 示例,但是,HPC 空间中还有许多其他堆栈),并保持打开的套接字侦听传入的请求。您需要为每个系统和应用程序持续维护大型进程白名单,这些系统和应用程序合法地将开放侦听套接字用于网站以外的目的,以消除任何误报。