использование одного и того же кэша для веб-сайта и веб-сервисов через IIS - PullRequest
0 голосов
/ 05 января 2011


мое приложение состоит из нескольких модулей: веб-сайта и нескольких служб, которые получают запросы от клиентских приложений.
, поскольку все эти модули манипулируют практически одинаковыми данными, я хотел бы иметь одинаковыекеш для всех из них.
Я использую статический класс для ссылки на кэш 2-го уровня nHibernate (объект SessionFactory) и настроил веб-сайт и веб-службы на одном и том же веб-сайте на IIS.
однако статические переменные 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),

трассировка стека: atManagers.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, логический и завершенный синхросигнал с ошибкой)System.Web.HttpApplication.System.Web.Web.Hosting.ISAPIRuntime.ProcessRequest (IntPtr ecb, Int32 iWRType)

и для веб-службы:
10:55:20 INFO General - создание новой фабрики сеансов для процесса: aspnet_wp (id = 7892),

трассировка стека находится в Managers.SessionManager.get_SessionFactory () в Managers.SessionManager.BindSessionToRequest () в Managers.SessionPerRequestHttpModule.Context_BeginRequest (Отправитель объекта, EventArgs e) в системе.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершенный синхронный) в System.Web..HttpApplication.System.Web..ISAPIRuntime.ProcessRequest (IntPtr ecb, Int32 iWRType)

Я использую IIS5 (хм, я знаю), и я попробовал все варианты конфигурации, которые я мог придумать.Я создал сайт и службу в качестве виртуальных каталогов на том же сайте, я установил для них уровень защиты «Низкий (процесс IIS)» и т. Д., Но безрезультатно.
Кто-нибудь понял?
заранее спасибо
Джонни

1 Ответ

1 голос
/ 05 января 2011

Если веб-приложение и служба работают в одном и том же процессе / сборке, я думаю, что они оба могут иметь доступ к кешу приложения. Когда SessionFactory инициализируется, если вы храните SessionFactory в кэше времени выполнения по имени (возможно, из словаря / хэша), вы сможете получить его по имени из веб-приложения или веб-службы. Ребята из SharpArchitecture имеют хорошо продуманное решение для кэширования сессионной фабрики, хотя их подход был для решения нескольких сценариев базы данных. В источнике также есть включения для сервисов, и я думаю, что вы сможете изменить то, что они создали, в соответствии с вашими потребностями. Если веб-приложение и служба должны работать отдельно (разные сборки), вы не сможете этого сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...