【问题标题】:How determine if application is web application如何确定应用程序是否为 Web 应用程序
【发布时间】:2010-07-05 13:11:44
【问题描述】:

在 Windows 服务和 Web 应用程序中运行的核心程序集中,我需要存储每个用户会话的信息。该服务将有一个用户会话,并且 Web 应用程序使用 HttpContext.Current。

我想配置在核心程序集中使用哪种方法 - 约定优于配置。我只想这样做一次,并且我相信从 Application_Start 运行时 HttpContext.Current 将为空。

如何可靠地确定应用程序是否为 Web 应用程序?

【问题讨论】:

    标签: .net


    【解决方案1】:
    if(HttpRuntime.AppDomainAppId != null)
    {
      //is web app
    }
    else
    {
      //is windows app
    }
    

    【讨论】:

    • HttpRuntime 对框架应用来说是一个很好的解决方案,但是 System.Web 目前在核心/标准 st 中并不存在。
    【解决方案2】:

    我会去的

    HostingEnvironment.IsHosted
    

    请注意,当您使用此类程序集中的方法时,即使您不打算使用它,也会产生轻微的开销。 (System.Web 将被加载,几个类可以被初始化和 JITed。)另外,现在对 System.Web 有一个硬依赖,所以你不能在有限的框架设置中使用它(目前 IIRC 仅与客户端配置文件一起使用) .

    另一种方法(虽然没有那么整洁和记录在案)是检查

    Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
    

    如果返回 web.config(或其大小写变体),它可能是一个 Web 应用程序。 (尽管您可以使用名为 web.config 的配置文件设置任何 appdomain,但这不太可能发生。)这避免了对 System.Web 的依赖。

    但是,HostingEnvironment.IsHosted 旨在指示 appdomain 是否配置为在 ASP.NET 下运行。

    【讨论】:

      【解决方案3】:

      所以没有人会和我犯同样的错误。

      Assembly.GetEntryAssembly() 无法定义其是否为 Web 应用程序。当它作为服务运行时,Assembly.GetEntryAssembly() 为空,但当我从 VS 调试时,它不为空。

      【讨论】:

        【解决方案4】:

        如果可能的话,我建议将它作为类库中某些初始化方法的输入参数,在使用类库之前需要调用该方法。

        如果这不是一个选项,我会查看HttpRuntime.Cache,即使HttpRuntime.Current 为空,我认为它也不为空。我不是网络表单人,但我记得有人在某个地方的某个时候提到过类似的问题(现在找不到那个问题)。

        【讨论】:

          【解决方案5】:

          在 Web 应用程序中,Assembly.GetEntryAssembly() 为空。我在两个库中使用它,到目前为止效果很好。

          【讨论】:

          • 我支持这个解决方案。刚刚使用通过 ASP.NET 和 Windows 服务在 Web 上下文中运行的代码对其进行了测试。
          猜你喜欢
          • 2017-03-22
          • 1970-01-01
          • 2011-05-12
          • 1970-01-01
          • 2020-05-05
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          相关资源
          最近更新 更多