在运行于Windows服务和Web应用程序中的核心程序集中,我需要为每个用户会话存储信息。该服务将有一个用户会话,并且该Web应用程序使用HttpContext.Current。如何确定应用程序是否是Web应用程序
我想配置在核心程序集中使用哪种方法 - 约定优于配置。我只想这样做一次,并且我认为从Application_Start运行时HttpContext.Current将为null。
如何可靠地确定应用程序是否是Web应用程序?
在运行于Windows服务和Web应用程序中的核心程序集中,我需要为每个用户会话存储信息。该服务将有一个用户会话,并且该Web应用程序使用HttpContext.Current。如何确定应用程序是否是Web应用程序
我想配置在核心程序集中使用哪种方法 - 约定优于配置。我只想这样做一次,并且我认为从Application_Start运行时HttpContext.Current将为null。
如何可靠地确定应用程序是否是Web应用程序?
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}
如果可能的话,我建议把它作为类库中的一些初始化方法的输入参数,在类库可以使用之前需要调用它。
如果这不是一个选项,我会看HttpRuntime.Cache
,即使HttpRuntime.Current
为空,我认为它将为非null。我不是一个web表单的人,但我记得某人在某个地方提到类似的问题(现在找不到这个问题)。
我会去
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下运行。
在web应用程序中,Assembly.GetEntryAssembly()为null。我在两个图书馆中使用它,到目前为止它效果很好。
就这么没有人和我犯同样的错误。
Assembly.GetEntryAssembly()不能用来定义它的Web应用程序还是不是。当它作为一个服务运行,然后Assembly.GetEntryAssembly()是空的,但是当我从VS调试,它不是null。
我第二个解决方案。只需通过ASP.NET以及Windows服务在Web上下文中运行代码即可对其进行测试。 – 2016-09-29 00:46:42