mon application est composée de plusieurs modules: un site Web et quelques services qui reçoivent des demandes d'applications client.
puisque tous ces modules manipulent à peu près les mêmes données, je voudrais avoir le même cache pour chacun d'entre eux.
J'utilise une classe statique pour référencer le cache de 2ème niveau de nHibernate (l'objet SessionFactory), et j'ai configuré le site web et les services web dans le même site web sur IIS.
Toutefois, les variables static SessionFactory sont différentes entre le site Web et le service Web.
Voici le code pour la classe SessionManager statique:
en utilisant le même cache pour le site Web et les services Web sur IIS
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();
}
}
et les journaux résultant:
pour le site web:
2011-01-05 10:54:54 Informations générales - la création d'un nouvelle usine de session pour le procédé: aspnet_wp (id = 7892),
trace de la pile est la suivante: à Managers.SessionManager.get_SessionFactory() à Managers.SessionManager.BindSessionToRequest() à Managers.SessionPerRequestHttpModule.Context_BeginRequest (expéditeur d'objet , EventArgs e) à System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() à System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & completedSynchronously) à System.Web.HttpApplication. ApplicationStepManager.ResumeSteps (erreur d'exception) à System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest (HttpContext contexte, AsyncCallback cb, objet extraData) à System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr) à System.Web .HttpRuntime.ProcessRequestNoDemand (HttpWorkerRequest wr) à System.Web.Hosting.ISAPIRuntime.ProcessRequest (IntPtr ecb, Int32 iWRType)
et pour le service Web:
10:55:20 Informations générales - la création d'une nouvelle usine de session pour processus: aspnet_wp (id = 7892),
trace de la pile est: à Managers.SessionManager.get_SessionFactory() Managers .SessionManager.BindSessionToRequest() à Managers.SessionPerRequestHttpModule.Context_BeginRequest (sender Object, EventArgs e) à System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() à System.Web.HttpApplication.ExecuteStep (Étape IExecutionStep, Boolean & completedSynchronously) at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps (Erreur d'exception) à System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest (HttpContext contexte, AsyncCallback cb, objet extraData) à System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr) à System.Web.HttpRuntime.ProcessRequestNoDemand (HttpWorkerRequest wr J'utilise IIS5 (beurk, je sais), et j'ai essayé toutes les options de configuration que je pouvais penser à. J'ai créé le site et le service sous forme de répertoires virtuels sous le même site, j'ai défini leur niveau de protection sur "Faible (processus IIS)", etc., mais en vain.
quelqu'un a eu une idée?
merci à l'avance,
Jhonny
J'ai essayé d'utiliser les objets Application et Cache, mais cela ne fonctionnait pas non plus. Si je vous comprends bien, vous pensez que les assemblys du site Web et les dll de service Web doivent être communs (les mêmes fichiers physiques, c'est-à-dire le même répertoire bin pour les deux applications)? Ce qui m'apparaît vraiment, c'est que j'ai une classe statique, et qu'elle exécute TWICE dans le même processus (on peut dire par l'ID du processus) - ce genre va à l'encontre du concept 'static' ... –
- J'ai déplacé les Web Services dans le projet WebSite, et maintenant ils semblent avoir les mêmes objets Cache que je voulais. Cependant, je ne suis pas la solution optimale, puisque conceptuellement le site Web et les services ne sont pas liés. Par conséquent, je n'ai pas répondu à ma question et je vais essayer de jouer un peu avec les services WCF et .NET4.0 dans un moment. –