我的應用程序由幾個模塊組成:一個網站以及一些接收來自客戶端應用程序的請求的服務。
由於所有這些模塊操縱幾乎相同的數據,我想擁有相同的緩存所有這些。
我正在使用靜態類來引用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
我試過使用應用程序和緩存對象,但那也沒有工作。 如果我很理解你,你認爲網站和web服務dll的程序集應該是通用的(相同的物理文件,即兩個應用程序的相同bin目錄)? 真正讓我感到有的是我有一個靜態類,它在同一個進程中運行TWICE(可以通過進程ID告訴) - 這種方式違背了「靜態」的整個概念...... – 2011-01-05 19:25:36
只是爲了更新 - 我將Web服務移到了WebSite項目中,現在他們似乎擁有像我想要的一樣的Cache對象。但是,我不認爲這是最佳解決方案,因爲概念上WebSite和服務不相關。因此,我沒有將問題標記爲答案,稍後我會嘗試使用WCF和.NET4.0服務。 – 2011-01-10 15:06:02