如何确定应用程序是否是Web应用程序

时间:2010-07-05 13:11:44

标签: .net

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

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

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

5 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:13)

我会去

HostingEnvironment.IsHosted

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

另一种方式(尽管不是很整洁并且有文件记录),是检查

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

如果这返回web.config(或其外壳变体),那么可能是一个Web应用程序。 (虽然您可以使用名为web.config的配置文件设置任何appdomain,但这不是一种可能的情况。)这样可以避免依赖System.Web。

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

答案 2 :(得分:2)

就是这样,没有其他人犯同样的错误。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

在Web应用程序中,Assembly.GetEntryAssembly()为null。我在两个库中使用它,到目前为止它工作得很好。