【问题标题】:using the same cache for web site and web services over IIS通过 IIS 为网站和 Web 服务使用相同的缓存
【发布时间】:2011-01-05 09:07:03
【问题描述】:


我的应用程序由几个模块组成:一个网站,以及一些从客户端应用程序接收请求的服务。
由于所有这些模块都处理几乎相同的数据,因此我希望为所有这些模块使用相同的缓存。
我正在使用静态类来引用 nHibernate 的二级缓存(SessionFactory 对象),并且我已经在 IIS 上的同一网站内设置了网站和 Web 服务。
但是,静态 SessionFactory 变量在网站和 Web 服务之间是不同的。
下面是静态 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 信息常规 - 为进程创建新会话工厂: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.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously) 在 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) 在 System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb,Int32 iWRType)

对于网络服务:
10:55:20 信息常规 - 为进程创建新会话工厂: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.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously) 在 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) 在 System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType)

我正在使用 IIS5(糟糕,我知道),并且我已经尝试了所有我能想到的配置选项。我已将站点和服务创建为同一站点下的虚拟目录,我已将其保护级别设置为“低(IIS 进程)”等,但无济于事。
有人有想法吗?
在此先感谢,
强尼

【问题讨论】:

    标签: asp.net nhibernate iis


    【解决方案1】:

    如果 Web 应用程序和服务在同一个进程/程序集中运行,我想他们可能都可以访问应用程序的应用程序缓存。当 SessionFactory 被初始化时,如果您碰巧按名称(可能是字典/哈希)将 SessionFactory 存储在运行时缓存中,您应该能够从 Web 应用程序或 Web 服务中按名称检索它。 SharpArchitecture 的家伙有一个完善的解决方案来缓存 sessionfactory,尽管他们的方法是为了解决多个数据库场景。该来源也包含服务,我认为您可以修改他们构建的内容以满足您的需求。如果 Web 应用程序和服务必须分开存在(不同的程序集),您可能无法做到这一点。

    【讨论】:

    • 我尝试过同时使用 Application 和 Cache 对象,但这也不起作用。如果我对您的理解正确,您认为网站和 Web 服务 dll 的程序集应该是通用的(相同的物理文件,即两个应用程序的相同 bin 目录)?真正让我感动的是我有一个静态类,它在同一个进程中运行两次(你可以通过进程 ID 来判断)——这违背了“静态”的整个概念......
    • 只是为了更新——我已经将 Web 服务移到了 WebSite 项目中,现在它们似乎具有我想要的相同缓存对象。但是,我不认为这是最佳解决方案,因为从概念上讲,网站和服务是不相关的。因此,我没有将我的问题标记为已回答,稍后我将尝试使用 WCF 和 .NET4.0 服务。
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 2017-11-28
    • 2012-06-21
    • 2011-02-11
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多