在核心程序集中,它在Windows服务和Web应用程序中运行,我需要按用户会话存储信息。该服务将具有单个用户会话,并且Web应用程序使用HttpContext.Current。
我想配置在核心程序集中使用哪种方法 - 约定优于配置。我只想这样做一次,我相信当从Application_Start运行时,HttpContext.Current将为null。
如何可靠地确定应用程序是否是Web应用程序?
答案 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。我在两个库中使用它,到目前为止它工作得很好。