如何找出当前的应用程序是否是ASP.NET Web应用程序

从托管类库中,我想知道当前正在执行的应用程序是否是ASP.NET Web应用程序(Web窗体或MVC)。

我看到了不同的方法来做到这一点,例如通过选择以下选项之一:

  • 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应用程序(显然)运行的托管类库(.net代码)
  • 这个“主机应用程序”可以是ASP.NET应用程序(例如Web窗体或MVC)或Windows应用程序(例如控制台或获胜形式)
  • 我的问题是 :有没有一种方法可以从我的类库(运行时)中可靠地确定它是否作为ASP.NET应用程序的一部分运行?
  • 注意 :我知道我可以实施一个不同的解决方案(例如见下面的评论或Tomas Lycken的回答),但这不是这个问题的要点。 类库已经存在,我想尽可能少地改变代码!


    可能不可靠。 MSDN意味着这将始终返回一个新的对象,如果一个不存在的话。 因此,在技术上有时间可以调用它,并且在被调用之前不存在它。

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

    所有的Web环境都需要一个环境。 该环境内的什么处理程序告诉您Web环境的类型。 (例如MvcHandler)。 请注意,对于相同的环境,这可以是不同类型的处理程序 - 例如,您可以一起运行MVC和Web表单。 它仅取决于当前正在服务的内容以及它正在使用的管线。

        System.Web.HttpContext.Current != null
    

    所有的网络应用都需要一个应用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应用程序。 (可能还有第三部分,这两种类型的应用程序都可以使用所有的功能...)


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

    也就是说,如果是我,如果我关心当前的请求,我可能会查看System.Web.HttpContext.Current,如果我想进行一般检查,我可能会查看System.Web.HttpRuntime.AppDomainAppId。

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

    来自ASP.NET团队的Stefan:

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

    在图书馆的情况下,我所描述的启发式就是要走的路。

    不过现在,什么是“ASP.NET应用程序”了? 现在,我可以将经典的.asp,ASP.NET,静态HTML和php全部插入到完全相同的vdir结构中,并将它们作为一个“应用程序”以半连贯的方式运行。

    链接地址: http://www.djcxy.com/p/21419.html

    上一篇: How to find out if the current application is an ASP.NET web app

    下一篇: IIS AppPoolIdentity and file system write access permissions