我的应用程序由几个模块组成:一个网站,以及一些接收来自客户端应用程序请求的服务
因为所有这些模块都操纵着几乎相同的数据,所以我想为所有这些模块提供相同的缓存
我正在使用静态类来引用nHibernate的二级缓存(SessionFactory对象),并且我在IIS上的同一网站中设置了网站和Web服务。
但是,静态SessionFactory变量在Web站点和Web服务之间是不同的
以下是静态SessionManager类的代码:
public static class SessionManager
{
private static ISessionFactory _sessionFactory = null;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
if (System.Web.HttpContext.Current != null)
{
log4net.Config.XmlConfigurator.Configure();
log4net.ILog log = log4net.LogManager.GetLogger("General");
log.InfoFormat("creating a new session factory for process: {0} (id = {1}), \n stack trace is: {2}",
System.Diagnostics.Process.GetCurrentProcess().ProcessName, System.Diagnostics.Process.GetCurrentProcess().Id,
new System.Diagnostics.StackTrace().ToString());
_sessionFactory = DAOBase.GetSessionFactory();
}
else
{
_sessionFactory = DAOBase.GetSessionFactoryForWin();
}
}
return _sessionFactory;
}
}
public static void BindSessionToRequest()
{
ISession session = SessionManager.SessionFactory.OpenSession();
NHibernate.Context.CurrentSessionContext.Bind(session);
}
public static void UnbindSession()
{
ISession session = NHibernate.Context.CurrentSessionContext.Unbind(SessionManager.SessionFactory);
if (session != null && session.IsOpen)
{
session.Close();
}
}
public static ISession GetCurrentSession()
{
return SessionFactory.GetCurrentSession();
}
}
以及由此产生的日志:
对于网站:
2011-01-05 10:54:54 INFO常规 - 为流程创建一个新的会话工厂:aspnet_wp(id = 7892),
堆栈跟踪是:在Managers.SessionManager.get_SessionFactory()
在Managers.SessionManager.BindSessionToRequest()
在Managers.SessionPerRequestHttpModule.Context_BeginRequest(Object sender,EventArgs e)
在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
在System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(异常错误)
在System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)
在System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
在System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
在System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)
并为网络服务:
10:55:20 INFO常规 - 为流程创建一个新的会话工厂:aspnet_wp(id = 7892),
堆栈跟踪是:在Managers.SessionManager.get_SessionFactory()
在Managers.SessionManager.BindSessionToRequest()
在Managers.SessionPerRequestHttpModule.Context_BeginRequest(Object sender,EventArgs e)
在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
在System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(异常错误)
在System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)
在System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
在System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
在System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)
我正在使用IIS5(哎呀,我知道),我已经尝试了我能想到的每个配置选项。我已将网站和服务创建为同一网站下的虚拟目录,我将其保护级别设置为“低(IIS进程)”等,但无济于事。
有人有个主意吗?
提前谢谢,
的Jhonny
答案 0 :(得分:1)
如果Web应用程序和服务在同一进程/程序集中运行,我想他们可能都可以访问应用程序的应用程序缓存。当SessionFactory初始化时,如果您恰好按名称(可能是字典/哈希)将SessionFactory存储在运行时缓存中,您应该能够通过Web应用程序或Web服务的名称检索它。 SharpArchitecture的人员有一个很好的解决方案来缓存sessionfactory,尽管他们的方法是为了解决多个数据库场景。该来源也包含服务内容,我认为您可以修改他们为满足您的需求而构建的内容。如果Web应用程序和服务必须单独存在(不同的程序集),您可能无法实现此目的。