2011-01-05 31 views
0


我的应用程序由几个模块组成:一个网站以及一些接收来自客户端应用程序的请求的服务。
由于所有这些模块操纵几乎相同的数据,我想拥有相同的缓存所有这些。
我正在使用静态类来引用nHibernate的第二级缓存(SessionFactory对象),并且我已经在IIS上的同一网站中设置了网站和Web服务。但是,静态SessionFactory变量在网站和Web服务之间是不同的。
下面是静态SessionManager类的代码:
通过IIS使用相同的缓存用于网站和Web服务

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秒信息一般 - 创建用于处理新会话工厂:的aspnet_wp(ID = 7892),

堆栈跟踪是:在Managers.SessionManager.get_SessionFactory() 在Managers.SessionManager.BindSessionToRequest() 在Managers.SessionPerRequestHttpModule.Context_BeginRequest(对象发件人,EventArgs的) 在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔& completedSynchronously) 在System.Web.HttpApplication。在的System.Web ApplicationStepManager.ResumeSteps(异常错误) 在System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext的上下文中,的AsyncCallback CB,而额外对象) 在System.Web.HttpRuntime.ProcessRequestInternal(的HttpWorkerRequest WR) .HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr) at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)

和Web服务:
十点55分20秒信息一般 - 创造过程的新会话工厂:的aspnet_wp(ID = 7892),

堆栈跟踪:在Managers.SessionManager.get_SessionFactory() 在经理.SessionManager.BindSessionToRequest() 在Managers.SessionPerRequestHttpModule.Context_BeginRequest(对象发件人,EventArgs的) 在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep (IExecutionStep步骤,布尔&同步完成) 在System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(异常错误)(HttpContext上下文,AsyncCallback cb,Object extraData)在System.Web.HttpRuntime.ProcessRequestNoDemand上的System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) (HttpWorkerRequestNoDemand(HttpWorkerRequest wr ) at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)

我正在使用IIS5(我知道),并且我已经尝试了我能想到的每个配置选项。我已经创建了网站和服务作为同一站点下的虚拟目录,我已将其保护级别设置为“低(IIS进程)”等,但无济于事。
有人有想法吗?
在此先感谢,
的Jhonny

回答

1

如果Web应用程序和服务在同一进程/组件正在运行,我想他们可能都可以访问的应用程序的应用程序缓存。当SessionFactory被初始化时,如果你碰巧将SessionFactory按名称(可能是字典/散列)存储到运行时缓存中,则应该能够通过Web应用程序或Web服务的名称检索它。 SharpArchitecture人员有一个很好的缓存sessionfactory的解决方案,尽管他们的方法是为了解决多个数据库场景。源代码也包含了服务的内容,我认为您可以修改它们构建的内容以满足您的需求。如果Web应用程序和服务必须单独存在(不同的程序集),则可能无法完成此操作。

+0

我试过使用应用程序和缓存对象,但那也没有工作。 如果我很理解你,你认为网站和web服务dll的程序集应该是通用的(相同的物理文件,即两个应用程序的相同bin目录)? 真正让我感到有的是我有一个静态类,它在同一个进程中运行TWICE(可以通过进程ID告诉) - 这种方式违背了“静态”的整个概念...... – 2011-01-05 19:25:36

+0

只是为了更新 - 我将Web服务移到了WebSite项目中,现在他们似乎拥有像我想要的一样的Cache对象。但是,我不认为这是最佳解决方案,因为概念上WebSite和服务不相关。因此,我没有将问题标记为答案,稍后我会尝试使用WCF和.NET4.0服务。 – 2011-01-10 15:06:02