2011-01-05 35 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