2011-01-05 11 views
0


私のアプリケーションは、Webサイトとクライアントアプリケーションから要求を受け取るいくつかのモジュールで構成されています。
これらのモジュールはすべて同じデータを操作するので、私はすべて同じキャッシュを使用したいと思います。
私は、静的クラスを使用してnHibernateの2番目のレベルのキャッシュ(SessionFactoryオブジェクト)を参照しています。IIS上の同じWebサイト内にWebサイトとWebサービスを設定しました。
しかし、静的SessionFactory変数は、WebサイトとWebサービスで異なります。
IIS上のWebサイトと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(); 
    } 
} 

し、得られたログ::ウェブサイトの


ここ は静的SessionManagerのクラスのコードです
2011-01-05 10時54分54秒INFO一般 - 作成しますプロセスのための新しいセッション工場:Managers.SessionPerRequestHttpModule.Context_BeginRequestでManagers.SessionManager.BindSessionToRequestでManagers.SessionManager.get_SessionFactory(で) () (オブジェクト送信者:aspnet_wp(ID = 7892)、

スタックトレースがあります、System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.ExecuteでのEventArgs e)の () System.Web.HttpApplication.ExecuteStep(IExecutionStepステップ、ブール& completedSynchronously)System.Web.HttpApplicationで ました。 System.WebのでApplicationStepManager.ResumeSteps(例外エラー)System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequestで (コンテキストのHttpContext、AsyncCallback CBが、extraDataオブジェクト)System.Web.HttpRuntime.ProcessRequestInternalで (HttpWorkerRequest WR) .HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr) at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb、Int32 iWRType)

と、Webサービスのための:
十時55分20秒INFO一般 - プロセスのための新しいセッションファクトリの作成:管理者にManagers.SessionManager.get_SessionFactory(で) :

、aspnet_wp(ID = 7892)スタックトレースがありますSystem.Web.HttpApplication.ExecuteStepでSystem.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.ExecuteでManagers.SessionPerRequestHttpModule.Context_BeginRequest(オブジェクト送信者、のEventArgs電子) () で.SessionManager.BindSessionToRequest() (IExecutionStepステップ、ブール&が同期して完了しました) at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(例外エラー)System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequestで(のHttpContextコンテキスト、AsyncCallback CBが、extraDataオブジェクト)System.Web.HttpRuntime.ProcessRequestInternalで (HttpWorkerRequest WR)System.Web.HttpRuntime.ProcessRequestNoDemandで (HttpWorkerRequest WR ) at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb、Int32 iWRType)

私はIIS5(yuck、私が知っている)を使用しています。私は同じサイトの下に仮想ディレクトリとしてサイトとサービスを作成しました。保護レベルを「低(IISプロセス)」などに設定しましたが、無駄です。
誰もがアイデアを得ましたか?事前に
おかげで、
ジョニー

答えて

1

Webアプリケーションおよびサービスは、同じプロセス/アセンブリで実行している場合は、私は彼らが両方のアプリケーションのアプリケーションキャッシュへのアクセス権を持っているかもしれない想像します。 SessionFactoryが初期化されるときに、SessionFactoryを名前(おそらく辞書/ハッシュ)でランタイムキャッシュに格納すると、WebアプリケーションまたはWebサービスから名前で取得できます。 SharpArchitectureのメンバーは、セッションファクトリをキャッシュするための優れたソリューションを用意していますが、そのアプローチは複数のデータベースシナリオを解決するためのものでした。ソースにはサービスの包含も含まれているため、ニーズに合わせて作成した内容を変更できると思います。 Webアプリケーションとサービスを別々に(別のアセンブリ)使用しなければならない場合、これを達成できないかもしれません。

+0

私はアプリケーションオブジェクトとキャッシュオブジェクトの両方を使用しようとしましたが、どちらも機能しませんでした。 私はあなたのことを分かりやすく理解していれば、WebサイトとWebサービスの両方のDLLのアセンブリは共通でなければならないと思います(同じ物理ファイル、つまり両方のアプリケーションの同じbinディレクトリ)。 私は本当に私が静的なクラスを持っているということです。同じプロセス(プロセスIDで伝えることができます)内でTWICEを実行しています。つまり、そのようなことは静的な概念全体に反しています... –

+0

- 私はWebSiteプロジェクトにWebサービスを移しました。今は、私が望むのと同じCacheオブジェクトを持っているようです。しかし、概念的にWebSiteとサービスは関連していないので、これは最適な解決策ではありません。だから私は答えたとして私の質問に印を付けていなかったし、私はWCF&.NET4.0サービスでちょっと試してみるつもりだ。 –

関連する問題