2010-07-05 156 views
19

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

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

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

回答

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

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

如果这不是一个选项,我会看HttpRuntime.Cache,即使HttpRuntime.Current为空,我认为它将为非null。我不是一个web表单的人,但我记得某人在某个地方提到类似的问题(现在找不到这个问题)。

11

我会去

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下运行。

1

在web应用程序中,Assembly.GetEntryAssembly()为null。我在两个图书馆中使用它,到目前为止它效果很好。

+0

我第二个解决方案。只需通过ASP.NET以及Windows服务在Web上下文中运行代码即可对其进行测试。 – 2016-09-29 00:46:42

2

就这么没有人和我犯同样的错误。

Assembly.GetEntryAssembly()不能用来定义它的Web应用程序还是不是。当它作为一个服务运行,然后Assembly.GetEntryAssembly()是空的,但是当我从VS调试,它不是null。

相关问题