繁体   English   中英

如何确定当前应用程序是否为 ASP.NET web 应用程序

[英]How to find out if the current application is an ASP.NET web app

从托管 class 库中,我想了解当前执行的应用程序是否是 ASP.NET web 应用程序(web ZAC68B64VC 或不是368ACCEFE2)。

我已经看到了不同的方法来做到这一点,例如通过检查以下之一:

  • System.Web.Hosting.HostingEnvironment.IsHosted == true
  • System.Web.HttpContext.Current != null
  • System.Web.HttpRuntime.AppDomainAppId != null
  • System.Web.HttpRuntime.Cache != null
  • 检查web.config文件(注意:我认为这不可靠)

问题是我应该使用哪种方法? 其中一些是无效的(即,即使在 windows 应用程序中运行,它们也可能返回 true)还是它们都相等?


更新/澄清(对不起,如果我的问题不够清楚):

  • 我有一个由 .net 应用程序运行的托管 class 库(.net 代码)(显然)
  • 此“主机应用程序”可以是 ASP.NET 应用程序(例如 web forms 或 MVC)或 Z0F4137ED8502B5B8 表单)应用程序 0(例如 web
  • 我的问题是:有没有办法从我的 class 库(在运行时)中可靠地确定它是否作为 ASP.NET 应用程序的一部分运行?

注意:我知道我可以实施不同的解决方案(例如,请参阅下面的评论或 Tomas Lycken 的回答),但这不是这个问题的重点。 class 库已经存在,我想更改尽可能少的代码!

可能不可靠。 MSDN 暗示这将始终返回一个新的 object 如果一个尚不存在。 因此,从技术上讲,有时您可以调用它并且在调用它之前不存在。

    System.Web.Hosting.HostingEnvironment.IsHosted == true

所有 web 环境都需要上下文。 该上下文中的处理程序告诉您 web 环境的类型。 (例如 MvcHandler )。 请注意,对于同一环境,这可能是不同类型的处理程序 - 例如,您可以一起运行 MVC 和 web forms。 它仅取决于当前提供的服务以及它使用的管道。

    System.Web.HttpContext.Current != null

所有 web 应用程序都需要一个应用程序 ID 它是唯一的,不会随着应用程序池的重新启动而改变。

    System.Web.HttpRuntime.AppDomainAppId != null

我从未见过这种情况,尽管从逻辑上讲,我可以想象没有使用缓存因此不可靠的时间。

    System.Web.HttpRuntime.Cache != null

你是对的。

检查 web.config 文件(注意:我认为这不可靠)

我在图书馆中使用这种东西。 我发现它可靠。

         Page page = (HttpContext.Current != null && HttpContext.Current.Handler != null) ? HttpContext.Current.Handler as Page : null;
         if (HttpRuntime.AppDomainAppId != null && page != null)
         {
            //I'm a web forms application
         }
         else if (HttpRuntime.AppDomainAppId != null && page == null && HttpContext.Current != null) { throw new InvalidOperationException("I'm an MVC application"); }
         else throw new InvalidOperationException("Im not ASP.Net web");

我必须在这里质疑您的目标:为什么库应该知道它运行的是哪种应用程序?

对我来说,听起来您需要将库的相关部分分成两部分 - 一部分用于 web 应用程序,另一部分用于 winforms 应用程序。 (可能还有第三部分,包含两种类型的应用程序都可以使用的所有内容......)

这可能会有所帮助:

如何检测我的 .NET 程序集是从 web 站点还是从台式机运行?

if(HttpRuntime.AppDomainAppId != null)
{
  //is web app
}
else
{
  //is windows app
}

首先,我同意这个问题是“错误的”。 你的图书馆不应该关心。 其次,如下所示,有许多启发式方法,但最终没有真正好的了解方法。 您的问题没有说明您为什么想知道或对此进行验证。

也就是说,如果是我,如果我关心当前请求,我可能会查看 System.Web.HttpContext.Current,或者如果我想要进行常规检查,我可能会查看 System.Web.HttpRuntime.AppDomainAppId。

没有保证。 这可能是个坏主意。

来自 ASP.NET 团队的 Stefan:

如果它是 web 应用程序及其正在运行的托管代码,则其 ASP.NET -) 的可能性为 99.9999%。 如果他的意思有所不同,例如查看 IIS 元数据库并试图确定应用程序是否真的是 ASP.NET 应用程序 - 那么就需要某种启发式方法。 例如,对于 IIS config/metbase 中的给定应用程序,获取应用程序的物理根目录 - 然后查看 web.config、*.aspx、*.ashx 等是否存在于该文件夹或任何子文件夹。 如果答案是肯定的,那么很可能是 ASP.NET 应用程序。 不幸的是,仅根据 IIS 存储的配置数据做出此决定是不够的。 每个应用程序池都有一个关联的 CLR 版本,即使没有托管代码在应用程序池中运行。 第二个 ASP.NET 与 IIS 集成在一台机器上启用,默认模块/处理程序列表都包括 ASP.NET 条目。

在图书馆的情况下,我描述的启发式方法将是 go 的方式。

但是,现在,什么是“ASP.NET 应用程序”? These days I can stick classic.asp, ASP.NET, static HTML, and php all into the exact same vdir structure and have it all function semi-coherently as a single "application".

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM