在IIS上使用相同的缓存来存放网站和Web服务


我的应用程序由几个模块组成:一个网站和一些接收客户端应用程序请求的服务。
因为所有这些模块操纵几乎相同的数据,所以我希望对所有这些模块都有相同的缓存。
我使用静态类来引用nHibernate的第二级缓存(SessionFactory对象),并且我已经在IIS上的同一网站中设置了网站和Web服务。
但是,Web站点和Web服务之间的静态SessionFactory变量不同。
以下是静态SessionManager类的代码:

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 INFO一般 - 为进程创建一个新的会话工厂:aspnet_wp(id = 7892),

堆栈跟踪是:在Managers.SessionManager.get_SessionFactory()在Managers.SessionManager.BindSessionToRequest()在Managers.SessionPerRequestHttpModule.Context_BeginRequest(对象发件人,EventArgs e)在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep。 System.Web.HttpApplication.ExecuteStep上的Execute()执行System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(异常错误)时System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext上下文中,执行IExecutionStep步骤,Boolean和completedSynchronously) (System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)AsyncCallback cb,Object extraData)

并为Web服务:
10:55:20 INFO General - 为进程创建一个新的会话工厂:aspnet_wp(id = 7892),

堆栈跟踪是:在Managers.SessionManager.get_SessionFactory()在Managers.SessionManager.BindSessionToRequest()在Managers.SessionPerRequestHttpModule.Context_BeginRequest(对象发件人,EventArgs e)在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep。 System.Web.HttpApplication.ExecuteStep上的Execute()执行System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(异常错误)时System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext上下文中,执行IExecutionStep步骤,Boolean和completedSynchronously) (System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)AsyncCallback cb,Object extraData)

我使用的是IIS5(我知道,),并且我已经尝试了我能想到的每个配置选项。 我已经创建了网站和服务作为同一站点下的虚拟目录,我已将其保护级别设置为“低(IIS进程)”等,但无济于事。
任何人有想法?
提前致谢,
的Jhonny


如果Web应用程序和服务在同一个进程/程序集中运行,我想他们都可以访问应用程序的应用程序缓存。 当SessionFactory被初始化时,如果你碰巧将SessionFactory按名称(可能是字典/散列)存储到运行时缓存中,则应该能够通过Web应用程序或Web服务的名称检索它。 SharpArchitecture人员有一个很好的缓存sessionfactory的解决方案,尽管他们的方法是为了解决多个数据库场景。 源代码也包含了服务的内容,我认为您可以修改它们构建的内容以满足您的需求。 如果Web应用程序和服务必须单独存在(不同的程序集),则可能无法完成此操作。

链接地址: http://www.djcxy.com/p/74525.html

上一篇: using the same cache for web site and web services over IIS

下一篇: Consuming a web service in multiple threads c#