2011-01-05 7 views
0


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

Répondre

1

Si l'application Web et le service sont en cours d'exécution dans le même processus/assemblage, j'imagine qu'ils pourraient tous deux avoir accès au cache de l'application de l'application. Lorsque le SessionFactory est initialisé, si vous stockez le SessionFactory dans le cache d'exécution par son nom (peut-être un dictionnaire/hachage), vous devriez pouvoir le récupérer par son nom depuis l'application Web ou le service Web. Les gars de SharpArchitecture ont une solution bien construite pour mettre en cache la sessionfactory, bien que leur approche visait à résoudre plusieurs scénarios de base de données. La source a aussi des inclusions pour les services et je pense que vous seriez en mesure de modifier ce qu'ils ont construit pour répondre à vos besoins. Si l'application Web et le service doivent vivre séparément (différents assemblages), vous ne pourrez peut-être pas accomplir cela.

+0

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' ... –

+0

- 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. –

Questions connexes